1. 程式人生 > >設計模式之——淺談strategy模式(策略模式)

設計模式之——淺談strategy模式(策略模式)

兩個 事情 操作 none 要去 編碼 淺談 一點 進行

strategy模式,即策略模式。個人覺得吧,策略模式更多的是一種思維方式。

首先我們要知道,為什麽需要策略模式。舉個例子,比如用程序輸出今天下午去玩什麽。

  • PlayGame 玩遊戲
package site.wangxin520.gof.strategy.demo;

/**
 * 玩遊戲的類
 * @author wangXgnaw
 *
 */
public class PlayGame {

    /**
     * 玩遊戲的方法
     */
    public void playGame(){
        System.out.println("玩遊戲");
    }
    
}
  • PlayBall 打球
package site.wangxin520.gof.strategy.demo;

/**
 * 玩球的類
 * @author wangXgnaw
 *
 */
public class PlayBall {

    /**
     * 打球的方法
     */
    public void playBall(){
        System.out.println("打球");
    }
    
    
}
  • Test測試類
package site.wangxin520.gof.strategy.demo;

/**
 * 測試
 * @author wangXgnaw
 *
 
*/ public class Test { public static void main(String[] args) { System.out.println("今天下午做什麽事情呢?"); PlayBall p1=new PlayBall(); p1.playBall(); // PlayGame p2=new PlayGame(); // p2.playGame(); } }

這裏就需要註意一點了,因為我們下午只能做一件事情,所以我們只能去註釋掉其中一個事情,結果就是:(這裏先把打遊戲給註釋掉了,下一個案例就是把打球給註釋掉,因為相同所以略)

技術分享

由此可見,如果我們想改變自己的下午的安排的話,需要很麻煩的,先去new 一個對應類的實現,然後再調用相應的方法。

既然原來方法很麻煩,那麽我們就想辦法改變它,當改變選擇/安排時候,簡化我們的操作。這就需要我們使用策略的設計模式。

策略模式裏面就要求我們去在對應安排的類裏面提取出一個策略類出來。就比如上面的案例,提取出一個play的策略類,在這個策略類裏面判斷是哪種安排:

  • play類
package site.wangxin520.gof.strategy.demo;

/**
 * 策略類
 * @author wangXgnaw
 *
 */
public class Play {
    
    //定義了常量,方便調用選擇策略
    public final static String PLAY_GAME="playGame";
    public final static String PLAY_BALL="playBall";
    
    //保存策略的安排
    private String playName;
    //使用單例模式,避免資源浪費。這兩個屬性是用於後面對應策略的調用的
    private static PlayBall playBall=new PlayBall();
    private static PlayGame playGame=new PlayGame();
    
    /**
     * 構造函數,傳入需要的安排
     * @param planName
     */
    public Play(String planName) {
        this.playName=planName;
    }
    
    /**
     * 這個是玩的類,在這個類中判斷,傳入的策略是哪一種,並進行對應的操作
     */
    public final void play(){
        if(PLAY_GAME==playName){
            playGame.playGame();
        }else if(PLAY_BALL==playName){
            playBall.playBall();
        }else{
            System.out.println("策略安排錯誤");
        }
    }
    
}
  • 這時候測試語句則為:
package site.wangxin520.gof.strategy.demo;

/**
 * 測試
 * @author wangXgnaw
 *
 */
public class Test {
    public static void main(String[] args) {
        
        System.out.println("今天下午做什麽事情呢?");
        
        Play p=new Play(Play.PLAY_GAME);
        p.play();
        
    }
}
  • 結果為:(當改變方案時候,只需要將參數改變即可,沒必要去重新new實現類了,測試打球略)

技術分享

由此可見,測試方面的代碼量大大減少了,也不需要我們再去new新的類了。這種思維模式就是策略模式。

也許你會問,白白多寫了play一個類,卻只減少了play中的兩行代碼,這壓根也沒有簡化操作。對此,我就要告訴你了,如果play相關的類都是其他人給你編寫好的,而你只需要在test裏面簡單調用一下,改變參數即可,也不需要你去new出類了,這樣對你來說是不是簡化了你很多操作。並且,如果使用了spring框架,完全可以把參數放到配置文件中,這樣一來,你都不需要去修改代碼了,不就是更簡化了你的操作了?

策略模式也有第二種方法,提取一個父類的抽象類或者接口,然後面向接口/抽象父類(使用多態)進行編程,這樣就更能大大簡化開發,並且方便後期維護。

在實際操作中,在切換redis客戶端集群版和單機版時候,就采用了這種方法,因為集群版和單機版對redis的NOSQL數據庫操作的api是不同的,所以提取出了一個接口,在我們程序中只要面對這個接口進行編程,不管是否是集群版或者單機版。當切換的時候,只需要在配置文件中切換一下相應的配置,而不需要去重新修改已經編號的代碼。可見,操作大大簡化了。

最後呢,策略模式是一種很好的思維模式,有多種實現方法,熟練運用,能大大提高編碼開發效率。與君共勉,好好努力!

設計模式之——淺談strategy模式(策略模式)