02設(shè)計模式之策略模式

策略模式主要針對一些拓展性特別強的方法進行類封裝

今天就來學透策略模式

策略模式的定義

該模式定義了一系列算法勤庐,并將每個算法封裝起來拐格,使它們可以相互替換百拓,且算法的變化不會影響使用算法的客戶渠鸽。策略模式屬于對象行為模式嫂粟,它通過對算法進行封裝读虏,把使用算法的責任和算法的實現(xiàn)分割開來责静,并委派給不同的對象對這些算法進行管理。

策略模式舉例了解

策略模式主要分三步(人陪貓玩):

人和貓是對象盖桥,玩是方法灾螃。方法有很多種,可以定義多個方法揩徊,在調(diào)用時寫上具體的調(diào)用方法腰鬼;但是這樣在維護時會修改代碼,違反開閉原則塑荒。同時熄赡,在大量的不同的行為方式也會導(dǎo)致類的類的體積龐大。此時就可以考慮使用策略模式:

第一步:找到要進行封裝的方法

定義Person類

package com.wwj.strategymode;

/**
 * 人
 */
public class Person {
    private String name;

    /**
     * 人與貓玩
     */
    public void playWithCat(){
        
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

抽象玩耍行為為策略接口

package com.wwj.strategymode;

/**
 * 人陪貓玩耍策略接口
 */
public interface PlayWithCatStrategy {

    /**
     * 人與貓玩耍
     */
    void play();
}

實現(xiàn)具體的策略

package com.wwj.strategymode;

/**
 * 用逗貓棒陪貓玩耍
 */
public class StickPlayWithCatStrategy implements PlayWithCatStrategy{

    @Override
    public void play() {
        System.out.println("我逗貓棒逗貓玩");
    }
}
package com.wwj.strategymode;

/**
 * 用紅外線陪貓玩耍
 */
public class InfraredPlayWithCatStrategy implements PlayWithCatStrategy{

    @Override
    public void play() {
        System.out.println("我紅外線逗貓玩");
    }
}

第二步:調(diào)用策略接口齿税,準備利用多態(tài)彼硫,實現(xiàn)不同的具體策略

package com.wwj.strategymode;

/**
 * 人
 */
public class Person {
    private String name;

    /**
     * 人與貓玩
     */
    public void playWithCat(PlayWithCatStrategy playWithCatStrategy){
        playWithCatStrategy.play();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

第三步:***最后使用策略模式(三種方式)

1.直接在需要調(diào)用的地方new 出從剛才創(chuàng)建的策略行為 注意:此時的策略模式使用單例因為策略模式知識針對行為的模式,在這里單例更為合適

package com.wwj.strategymode;

public class main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("張三");
        PlayWithCatStrategy playWithCatStrategy;
        String key = "0";
        if ("0".equals(key)){
            playWithCatStrategy = new InfraredPlayWithCatStrategy();
        }else{
            playWithCatStrategy = new StickPlayWithCatStrategy();
        }        
        person.playWithCat(playWithCatStrategy);
    }
}

2.有的時候直接new出行為還需要寫很多層if esle,這是我們就可以采用將所有的策略在java的配置類中進行將全部策略初始化拧篮,利用map去避免ifelse的判斷词渤,這樣在使用時只需要修改配置類中的初始化方法和新增策略類就可以進行拓展

package com.wwj.strategymode;

import java.util.HashMap;
import java.util.Map;

/**
 * 策略模式的配置類
 */
public class PlayStrtegyConfig {
    public static final Map<String,Object> map = new HashMap<>();
    static {
        map.put("0",new StickPlayWithCatStrategy());
        map.put("1",new InfraredPlayWithCatStrategy());
    }

    /**
     * 構(gòu)造方法私有化
     */
    private PlayStrtegyConfig(){}
}
package com.wwj.strategymode;

public class main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("張三");
        String key = "1";
        PlayWithCatStrategy playWithCatStrategy = (PlayWithCatStrategy)PlayStrtegyConfig.map.get(key);
        person.playWithCat(playWithCatStrategy);
    }
}

3.對于經(jīng)常會發(fā)生變化的策略 我們還可以將所有策略寫在配置類中,這樣更加靈活串绩,同樣也是需要將每個策略模式攜程單例模式缺虐。

讀取配置文件類

package com.wwj.strategymode;

import com.wwj.tank.ConfigMgr;

import java.io.IOException;
import java.util.Properties;

/**
 * 獲取配置文件信息(單例)
 */
public class PlayStrtegyConfigFile {
    private static final PlayStrtegyConfigFile instance = new PlayStrtegyConfigFile();
    private static Properties prop = new Properties();
    static {
        try {
            prop.load(ConfigMgr.class.getClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private PlayStrtegyConfigFile(){}


    public static PlayStrtegyConfigFile getInstance(){
        return instance;
    }

    public String get(String name){
        if(prop == null) return null;
        return prop.get(name).toString();
    }
}

配置文件

#玩的策略
0=com.wwj.strategymode.InfraredPlayWithCatStrategy
1=com.wwj.strategymode.StickPlayWithCatStrategy

利用Class類加載對象

package com.wwj.strategymode;

import java.lang.reflect.InvocationTargetException;

public class main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Person person = new Person();
        person.setName("張三");
        String key = "1";
        //獲取配置文件的類型
        String name =  PlayStrtegyConfigFile.getInstance().get(key);
        //將類加載到內(nèi)存中(利用無參構(gòu)造的方式)
        PlayWithCatStrategy playWithCatStrategy = (PlayWithCatStrategy)Class.forName(name).getDeclaredConstructor().newInstance();
        person.playWithCat(playWithCatStrategy);
    }
}

最后,策略模式基本限于明顯需要很強的拓展性的地方礁凡,例如像微信的消息處理高氮、設(shè)備的讀取數(shù)據(jù)....等這類需要明顯在后期開發(fā)中進行拓展時,我們選擇策略模式是比較好的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顷牌,一起剝皮案震驚了整個濱河市纫溃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌韧掩,老刑警劉巖紊浩,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疗锐,居然都是意外死亡坊谁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門滑臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來口芍,“玉大人,你說我怎么就攤上這事雇卷△尥郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵关划,是天一觀的道長小染。 經(jīng)常有香客問我,道長贮折,這世上最難降的妖魔是什么裤翩? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮调榄,結(jié)果婚禮上踊赠,老公的妹妹穿的比我還像新娘。我一直安慰自己每庆,他們只是感情好筐带,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缤灵,像睡著了一般伦籍。 火紅的嫁衣襯著肌膚如雪蓝晒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天鸽斟,我揣著相機與錄音拔创,去河邊找鬼利诺。 笑死富蓄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的慢逾。 我是一名探鬼主播立倍,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侣滩!你這毒婦竟也來了口注?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤君珠,失蹤者是張志新(化名)和其女友劉穎寝志,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策添,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡材部,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唯竹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乐导。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浸颓,靈堂內(nèi)的尸體忽然破棺而出物臂,到底是詐尸還是另有隱情,我是刑警寧澤产上,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布棵磷,位于F島的核電站,受9級特大地震影響晋涣,放射性物質(zhì)發(fā)生泄漏泽本。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一姻僧、第九天 我趴在偏房一處隱蔽的房頂上張望规丽。 院中可真熱鬧,春花似錦撇贺、人聲如沸赌莺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艘狭。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巢音,已是汗流浹背遵倦。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留官撼,地道東北人梧躺。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像傲绣,于是被迫代替她去往敵國和親掠哥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 策略模式屬于對象的行為模式秃诵。其用意是針對一組算法续搀,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可...
    薩達哈魯醬閱讀 240評論 0 1
  • 設(shè)計模式之策略模式 1.意圖 根據(jù)GOF的定義:定義一系列的算法或操作菠净,并把它們一個個封裝起來禁舷,并且使它們可以互換...
    dandan的微笑閱讀 604評論 0 0
  • 在程序設(shè)計中,我們也常常遇到類似的情況毅往,要實現(xiàn)某一個功能有多種方案可以選擇牵咙。比如一個壓縮文件的程序,既可以選擇zi...
    yufawu閱讀 369評論 0 3
  • 一個陽光明媚的上午煞抬,靚仔正在開心的劃水摸魚霜大,耳機里傳來音樂“不是吧不是吧,難道單壓也算壓......” 產(chǎn)品經(jīng)理突...
    靚仔聊編程閱讀 312評論 0 3
  • 1. 介紹 策略模式定義了算法家族革答,分別封裝起來战坤,讓它們之間可以互相替換,此模式讓算法的變化不會影響到客戶端残拐。從概...
    天羽天閱讀 299評論 0 0