1.政策模式官方定義及分析
- 政策模式也叫政策模式,允許程式在運作時選擇一個算法執行,通常存在一類算法實作提供外部選擇執行,這裡的算法,也可以叫政策。
- 定義一類算法,各自獨立封裝實作,并且互相之間是可替換的。除此之外,由用戶端決定具體使用何種算法。
兩個定義中都提及到了算法一詞,這裡的算法含義比較寬泛,指的是一個業務操作。
定義中提到的 通常存在一類算法實作提供外部選擇執行 ; 定義一類算法,各自獨立封裝實作,并且互相之間是可替換的。 很像是父類中定義方法,不同的子類去重寫方法,是以說政策模式展現的是父類與子類的關系。但在很多時候,它是以接口的形式實作,将各個”子類“具有的公共方法抽象封裝成接口方法,再用“子類”去實作接口,重寫接口中的方法。如UML類圖中所示。
圖中包含OperationA和OperationB兩個類,也可以稱其為算法,算法内中A和B由各自的業務邏輯,do()方法,将這兩個類的公共方法封裝成一個政策類(接口)。然後引入一個Context類,這個類的作用是連接配接Strategy接口和用戶端Client類,使政策類能被用戶端給調用,Context被叫做上下文類。在Context類中傳入Strategy接口的某一個實作類的執行個體,即A或B的執行個體對象,然後在類内部定義一個公共的executeStrategy()方法,用戶端調用這個方法,即可擷取到對應的A或B的實作方法。
綜上,使用政策模式分為以下幾個步驟:
1.定義抽象政策角色(Strategy): 即上圖中的接口,接口中包括所有共用的方法。
2. 定義具體政策角色(ConcreteStrategy): 即上圖中接口的實作類A和B。
3. 定義環境角色(Context): 即上圖中的Context類,用于連接配接政策角色與用戶端。
2.政策模式實作示例
使用政策模式實作電腦的加減乘除功能
定義抽象政策角色(Stratrgy)
public interface Operation {
/**
* 定義運算的共有方法
*/
int doOperation(int num1,int num2);
}
定義具體政策角色(ConcreteStrategy)
加法實作類
public class OperatonAdd implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
減法實作類
public class OperationSub implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
乘法實作類
public class OperationMultiply implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
除法實作類
public class OperationDivide implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 / num2;
}
}
定義環境角色(Context)
并進行測試實作
public class Calculator {
private Operation operation;
public void setOperation(Operation operation) {
this.operation = operation;
}
public int doOperation(int num1,int num2){
return this.operation.doOperation(num1,num2);
}
//測試
public static void main(String[] args) {
Calculator calculator1 = new Calculator();
calculator1.setOperation(new OperatonAdd());
System.out.println(calculator1.doOperation(2, 1));
Calculator calculator2 = new Calculator();
calculator2.setOperation(new OperationSub());
System.out.println(calculator2.doOperation(2, 1));
Calculator calculator3 = new Calculator();
calculator3.setOperation(new OperationMultiply());
System.out.println(calculator3.doOperation(2, 2));
Calculator calculator4 = new Calculator();
calculator4.setOperation(new OperationDivide());
System.out.println(calculator4.doOperation(2, 2));
}
}
政策模式的使用場景
- 許多相關類僅僅是行為不同。
- 需要使用一個算法的不同實作。
- 算法使用了客戶不應該知道的資料。政策模式可以避免暴露複雜的、與算法相關的資料結構。
- 一個類定義了很多行為,而且這些行為在這個類裡的操作以多個條件語句的形式出現。政策模式将相關的條件分支移入它們各自的 Strategy 類中以代替這些條件語句。