設(shè)計(jì)模式:策略模式

一 場(chǎng)景

在軟件開發(fā)中佩微,有許多算法可以實(shí)現(xiàn)某一功能佛纫,如需要提供多種查找算法妓局,可以將這些算法寫到一個(gè)類中,在該類中提供多個(gè)方法雳旅,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的算法跟磨;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中,通過if…else…等條件判斷語句來進(jìn)行選擇攒盈。但是如果需要增加一種新的算法抵拘,需要修改封裝算法類的源代碼;更換算法型豁,也需要修改客戶端調(diào)用代碼僵蛛。在這個(gè)算法類中封裝了大量算法,該類代碼將較復(fù)雜迎变,維護(hù)較為困難充尉。于是我們策略模式便登場(chǎng)了。

二 定義

策略模式:定義一系列算法衣形,將每一個(gè)算法封裝起來驼侠,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化谆吴。
這個(gè)模式涉及到三個(gè)角色:

  • 環(huán)境(Context)角色:持有一個(gè)Strategy的引用倒源。
  • 抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)句狼。此角色給出所有的具體策略類所需的接口笋熬。
  • 具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為。


    IntStrategy.png

    Strategy:

package headFirst.strategyPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 22:56
 */
public interface Strategy<T> {

    public Boolean diffStrategy(T source,T target);
}

ConcreteStrategy:

package headFirst.strategyPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 22:59
 */
public class IntStrategy implements Strategy<Integer> {
    public Boolean diffStrategy(Integer source, Integer target) {
        return source == target;
    }
}
//-----------------------------

package headFirst.strategyPattern;

import java.util.List;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 23:11
 */
public class ListStrategy extends StringStrategy {

    public Boolean diffStrategy(List<String> source, List<String> target) {
        String sourceString = null;
        String targetString =null;
        return super.diffStrategy(sourceString,targetString);
    }


}
//--------------------------
package headFirst.strategyPattern;

import java.util.List;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 23:13
 */
public class StringStrategy implements Strategy<String> {
    public Boolean diffStrategy(String source, String target) {
        return source.equals(target);
    }
}

Context:

package headFirst.strategyPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 22:52
 */
public class Diff {

    private Strategy  strategy;

    public Diff(Strategy strategy){
        this.strategy  = strategy;
    }

    public void diffResult(Object source,  Object target){
        if(strategy.diffStrategy(source,target)){
            System.out.println("is same");
        }else {
            System.out.println("is not same");
        }
    }


}

test:

package headFirst.strategyPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-06-26 22:36
 */
public class StartegyPatternTest {


    public static   void main(String  [] args ){
        Strategy strategy =  new IntStrategy();
        Strategy strategy1 = new StringStrategy();
        Diff intDiff = new Diff(strategy);
        intDiff.diffResult(1,2);
        Diff stringDiff = new Diff(strategy1);
        stringDiff.diffResult("1","1");
    }

}
//------------input:
is not same
is same

三 優(yōu)點(diǎn)

  • 對(duì)“開閉原則”的完美支持腻菇,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為胳螟,也可以靈活地增加新的算法或行為昔馋。
  • 策略模式提供了管理相關(guān)的算法族的辦法。
  • 策略模式提供了可以替換繼承關(guān)系的辦法糖耸。
  • 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句

四 缺點(diǎn)

  • 客戶端必須知道所有的策略類秘遏,并自行決定使用哪一個(gè)策略類
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蔬捷,隨后出現(xiàn)的幾起案子垄提,更是在濱河造成了極大的恐慌榔袋,老刑警劉巖周拐,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凰兑,居然都是意外死亡妥粟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門吏够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勾给,“玉大人,你說我怎么就攤上這事锅知〔ゼ保” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵售睹,是天一觀的道長桩警。 經(jīng)常有香客問我,道長昌妹,這世上最難降的妖魔是什么捶枢? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮飞崖,結(jié)果婚禮上烂叔,老公的妹妹穿的比我還像新娘。我一直安慰自己固歪,他們只是感情好蒜鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牢裳,像睡著了一般逢防。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贰健,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天胞四,我揣著相機(jī)與錄音,去河邊找鬼伶椿。 笑死辜伟,一個(gè)胖子當(dāng)著我的面吹牛氓侧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播导狡,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼约巷,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了旱捧?” 一聲冷哼從身側(cè)響起独郎,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枚赡,沒想到半個(gè)月后氓癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贫橙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年贪婉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卢肃。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疲迂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莫湘,到底是詐尸還是另有隱情尤蒿,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布幅垮,位于F島的核電站腰池,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏军洼。R本人自食惡果不足惜巩螃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匕争。 院中可真熱鬧避乏,春花似錦、人聲如沸甘桑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉己。三九已至赫蛇,卻和暖如春肤寝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背体捏。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工腐泻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵搁,地道東北人窄做。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓愧驱,卻偏偏與公主長得像慰技,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子组砚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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