14.Strategy-策略模式

Strategy 策略模式

  • 策略模式:
    也稱爲政策模式(Policy)。策略模式定義了一系列算法,並將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使用算法的客戶。
    這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有算法,
    減少各種算法類與使用類之間的耦合。策略模式是一種對象行爲型模式。

  • 結構圖:
    Strategy_structure

  • 示例類圖:
    Strategy_uml

  • 示例代碼:

// Strategy
public interface Operation {
    public int doOperation(int x, int y);
}

// ConcreteStrategy
public class OperationAdd implements Operation {
    @Override
    public int doOperation(int x, int y) {
        return x + y;
    }
}
public class OperationMultiply implements Operation {
    @Override
    public int doOperation(int x, int y) {
        return x * y;
    }
}
public class OperationSubstract implements Operation {
    @Override
    public int doOperation(int x, int y) {
        return x - y;
    }
}

// Context
public class Calculator {
    private Operation operation;

    public Calculator(Operation operation) {
        this.operation = operation;
    }

    public void setOperation(Operation operation) {
        this.operation = operation;
    }

    public int executeOperation(int x, int y) {
        return operation.doOperation(x, y);
    }
}

public class StrategyTest {

    public static void main(String[] args) {
        Calculator calculator = new Calculator(new OperationAdd());
        System.out.println(calculator.executeOperation(1000, 24));

        calculator.setOperation(new OperationMultiply());
        System.out.println(calculator.executeOperation(1000, 24));
    }

}

角色:
1. Context(環境類):
環境類是使用算法的角色,它在解決某個問題(即實現某個方法)時可以採用多種策略。在環境類中維持一個對抽象策略類的引用實例,用於定義所採用的策略。

  1. Strategy(抽象策略類):
    它爲所支持的算法聲明瞭抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是接口。
    環境類通過抽象策略類中聲明的方法在運行時調用具體策略類中實現的算法。
      
  2.  ConcreteStrategy(具體策略類):
    它實現了在抽象策略類中聲明的算法,在運行時,具體策略類將覆蓋在環境類中定義的抽象策略類對象,使用一種具體的算法實現某個業務處理。

    • 策略模式解析
      策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相通的工作,
      只是實現不同,它可以以相同的方式調用所有的算法,減少各種算法類和使用算法類之間的耦合。
      策略模式就是用來封裝算法的,但是實踐中,我們發現可以用它來分裝幾乎任何類型的規則,
      只要在分析過程中聽到需要在不同的時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章