設(shè)計模式之策略模式和狀態(tài)模式

1 策略模式

我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法,

我們可以簡單理解為更加不同的策略對象,執(zhí)行不同策略方法。


2 類圖

 
3 代碼實現(xiàn)

1)接口:Strategy.java

    public interface Strategy {
       public int doOperation(int num1, int num2);
    }

 2)實現(xiàn)類:OperationAdd.java

    public class OperationAdd implements Strategy{
       @Override
       public int doOperation(int num1, int num2) {
          return num1 + num2;
       }
    }

3)實現(xiàn)類:OperationSubstract.java

    public class OperationSubstract implements Strategy{
       @Override
       public int doOperation(int num1, int num2) {
          return num1 - num2;
       }
    }

4)實現(xiàn)類:OperationMultiply.java

    public class OperationMultiply implements Strategy{
       @Override
       public int doOperation(int num1, int num2) {
          return num1 * num2;
       }
    }

5)創(chuàng)建Context.java

    public class Context {
       private Strategy strategy;
     
       public Context(Strategy strategy){
          this.strategy = strategy;
       }
     
       public int executeStrategy(int num1, int num2){
          return strategy.doOperation(num1, num2);
       }
    }

StrategyPatternDemo 里面的main函數(shù)

    public class StrategyPatternDemo {
       public static void main(String[] args) {
          Context context = new Context(new OperationAdd());    
          System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
     
          context = new Context(new OperationSubstract());      
          System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
     
          context = new Context(new OperationMultiply());    
          System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
       }
    }

 

 
4 運行結(jié)果

    10 + 5 = 15
    10 - 5 = 5
    10 * 5 = 50

 
5 對比狀態(tài)模式

我們上面策略模式里面的Demo里面每次都是通過傳遞新的策略對象來構(gòu)建Context對象,那我們的狀態(tài)模式可以理解為我們在Context類里面有單獨設(shè)置策略對象的函數(shù),不需要每次進行構(gòu)建Context,狀態(tài)模式是通過狀態(tài)轉(zhuǎn)移來改變 Context 所組合的 State 對象,而策略模式是通過 Context本身的決策來改變組合的 Strategy 對象


6 代碼實現(xiàn)

我們把上面的Context里面的構(gòu)造方法里面不要單獨進行傳遞策略對象,我們單獨增加一個SetStrategy這樣的函數(shù)來設(shè)置策略改變當(dāng)前類的策略對象具體的屬性值。

Context.java

    public class Context {
       private Strategy strategy;
     
       public Context(){
          
       }
     
       public SetStrategy(Strategy strategy){
          this.strategy = strategy;
       }
     
       public int executeStrategy(int num1, int num2){
          return strategy.doOperation(num1, num2);
       }
    }

    public static void main(String[] args) {
          Context context = new Context();    
          context.SetStrategy(new OperationAdd());    
          System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
          context.SetStrategy(new OperationSubstract());    
          System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
          context.SetStrategy(new OperationMultiply());          
          System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }

部分內(nèi)容參考鏈接:https://www.runoob.com/design-pattern/state-pattern.html

 

 

 



 

 

作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)