天天看點

23種設計模式—④政策模式

1.政策模式官方定義及分析

  1. 政策模式也叫政策模式,允許程式在運作時選擇一個算法執行,通常存在一類算法實作提供外部選擇執行,這裡的算法,也可以叫政策。
  2. 定義一類算法,各自獨立封裝實作,并且互相之間是可替換的。除此之外,由用戶端決定具體使用何種算法。

兩個定義中都提及到了算法一詞,這裡的算法含義比較寬泛,指的是一個業務操作。

定義中提到的 通常存在一類算法實作提供外部選擇執行 ; 定義一類算法,各自獨立封裝實作,并且互相之間是可替換的。 很像是父類中定義方法,不同的子類去重寫方法,是以說政策模式展現的是父類與子類的關系。但在很多時候,它是以接口的形式實作,将各個”子類“具有的公共方法抽象封裝成接口方法,再用“子類”去實作接口,重寫接口中的方法。如UML類圖中所示。

23種設計模式—④政策模式

圖中包含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.政策模式實作示例

使用政策模式實作電腦的加減乘除功能

23種設計模式—④政策模式

定義抽象政策角色(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 類中以代替這些條件語句。