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

1 策略模式

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

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


2 類圖

 
3 代碼實(shí)現(xiàn)

1)接口:Strategy.java

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

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

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

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

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

4)實(shí)現(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 運(yùn)行結(jié)果

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

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

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


6 代碼實(shí)現(xiàn)

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

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)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)