設(shè)計模式之策略模式-Java語言描述

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

策略模式
在策略模式(Strategy Pattern)中囱持,一個類的行為或其算法可以在運行時更改。
這種類型的設(shè)計模式屬于行為型模式。
在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象膘掰。
策略對象改變 context 對象的執(zhí)行算法。

策略模式是指有一定行動內(nèi)容的相對穩(wěn)定的策略名稱佳遣。策略模式在古代中又稱“計策”识埋,簡稱“計”,
如《漢書·高帝紀上》:“漢王從其計”零渐。這里的“計”指的就是計謀窒舟、策略。策略模式具有相對穩(wěn)定的形式诵盼,
如“避實就虛”惠豺、“出奇制勝”等银还。一定的策略模式,既可應(yīng)用于戰(zhàn)略決策洁墙,也可應(yīng)用于戰(zhàn)術(shù)決策蛹疯;
既可實施于大系統(tǒng)的全局性行動,也可實施于大系統(tǒng)的局部性行動热监。


先直接貼栗子吧捺弦,概念在文章最后會介紹,也可以自行百度

我們有一個系統(tǒng)對接了各大主流的新聞網(wǎng)站孝扛,在我們的系統(tǒng)在中錄入新聞可以實現(xiàn)一鍵發(fā)布到指定的網(wǎng)站中羹呵,
現(xiàn)在需要實現(xiàn)這個功能。主要需求:

  1. 各個網(wǎng)站的對接邏輯不同疗琉,需要解耦冈欢。
  2. 對于客戶端的使用習慣不能有影響。
    考慮再三決定使用策略模式來解決

步驟一:創(chuàng)建一個上傳接口

/**
 * 上傳接口
 *
 * @author shenjg
 * @date 2019/07/23
 **/
public interface UploadService {

    /**
     * 上傳數(shù)據(jù)到網(wǎng)站
     *
     * @param object
     */
    void uploadToWeb(Object object);
}

步驟二:針對不同網(wǎng)站實現(xiàn)接口

/**
 * 上傳數(shù)據(jù)到百度
 *
 * @author shenjg
 * @date 2019/07/23
 **/
public class BaiduUploadService implements UploadService {
    @Override
    public void uploadToWeb(Object object) {
        // do something
        System.out.println("執(zhí)行上傳到百度所需要的邏輯" + object);
    }
}
/**
 * 上傳數(shù)據(jù)到新浪
 *
 * @author shenjg
 * @date 2019/07/23
 **/
public class SinaUploadService implements UploadService {
    @Override
    public void uploadToWeb(Object object) {
        // do something
        System.out.println("執(zhí)行上傳到新浪所需要的邏輯" + object);
    }
}
/**
 * 上傳數(shù)據(jù)到騰訊
 *
 * @author shenjg
 * @date 2019/07/23
 **/
public class TencentUploadService implements UploadService {
    @Override
    public void uploadToWeb(Object object) {
        // do something
        System.out.println("執(zhí)行上傳到騰訊所需要的邏輯" + object);
    }
}

步驟三:創(chuàng)建context

/**
 * @author shenjg
 * @date 2019/07/23
 **/
public class UploadContext {

    private UploadService uploadService;

    public UploadContext(UploadService uploadService) {
        this.uploadService = uploadService;
    }

    public void uploadToWeb(Object object) {
        uploadService.uploadToWeb(object);
    }
}

步驟四:測試

/**
 * 策略模式測試類
 *
 * @author shenjg
 * @date 2019/07/23
 **/
public class StrategyTest {
    public static void main(String[] args) {

        Object object = new Object();

        // 上傳object到百度
        UploadContext baiduUpload = new UploadContext(new BaiduUploadService());
        baiduUpload.uploadToWeb(object);

        // 上傳object到騰訊
        UploadContext tencentUpload = new UploadContext(new TencentUploadService());
        tencentUpload.uploadToWeb(object);


        // 上傳object到新浪
        UploadContext sinaUpload = new UploadContext(new SinaUploadService());
        sinaUpload.uploadToWeb(object);

    }
}

輸出打印

執(zhí)行上傳到百度所需要的邏輯java.lang.Object@610455d6
執(zhí)行上傳到騰訊所需要的邏輯java.lang.Object@610455d6
執(zhí)行上傳到新浪所需要的邏輯java.lang.Object@610455d6

點擊查看完整代碼github

介紹

策略模式作為一種軟件設(shè)計模式盈简,指對象有某個行為凑耻,但是在不同的場景中,該行為有不同的實現(xiàn)算法柠贤。例如:
我們需要上傳同一篇文章到新浪香浩、騰訊、百度三大網(wǎng)站中臼勉,此時系統(tǒng)針對不同網(wǎng)站就需要不同的對接邏輯邻吭。
策略模式:

  • 定義了一組算法(業(yè)務(wù)規(guī)則);
  • 封裝了每個算法宴霸;
  • 這族的算法可互換代替(interchangeable)

組成

  • 抽象策略角色: 策略類囱晴,通常由一個接口或者抽象類實現(xiàn)。
  • 具體策略角色:包裝了相關(guān)的算法和行為瓢谢。
  • 環(huán)境角色:持有一個策略類的引用畸写,最終給客戶端調(diào)用。
    策略模式UML圖

應(yīng)用場景:

  1. 多個類只區(qū)別在表現(xiàn)行為不同氓扛,可以使用Strategy模式枯芬,在運行時動態(tài)選擇具體要執(zhí)行的行為。
  2. 需要在不同情況下使用不同的策略(算法)采郎,或者策略還可能在未來用其它方式來實現(xiàn)千所。
  3. 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立蒜埋。

優(yōu)缺點

優(yōu)點

  • 策略模式提供了管理相關(guān)的算法族的辦法淫痰。策略類的等級結(jié)構(gòu)定義了一個算法或行為族。恰當使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面理茎,從而避免重復(fù)的代碼黑界。
  • 策略模式提供了可以替換繼承關(guān)系的辦法管嬉。繼承可以處理多種算法或行為。如果不是用策略模式朗鸠,那么使用算法或行為的環(huán)境類就可能會有一些子類蚯撩,每一個子類提供一個不同的算法或行為。但是烛占,這樣一來算法或行為的使用者就和算法或行為本身混在一起胎挎。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨立演化忆家。繼承使得動態(tài)改變算法或行為變得不可能犹菇。
  • 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。多重轉(zhuǎn)移語句不易維護芽卿,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起揭芍,統(tǒng)統(tǒng)列在一個多重轉(zhuǎn)移語句里面,比使用繼承的辦法還要原始和落后卸例。

缺點

  • 客戶端必須知道所有的策略類称杨,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別筷转,以便適時選擇恰當?shù)乃惴惞迷Q言之,策略模式只適用于客戶端知道所有的算法或行為的情況呜舒。
  • 策略模式造成很多的策略類锭汛,每個具體策略類都會產(chǎn)生一個新類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面袭蝗,而將策略類設(shè)計成可共享的唤殴,這樣策略類實例可以被不同客戶端使用。換言之呻袭,可以使用享元模式來減少對象的數(shù)量眨八。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腺兴,一起剝皮案震驚了整個濱河市左电,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌页响,老刑警劉巖篓足,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闰蚕,居然都是意外死亡栈拖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門没陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涩哟,“玉大人索赏,你說我怎么就攤上這事√耍” “怎么了潜腻?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器仗。 經(jīng)常有香客問我融涣,道長,這世上最難降的妖魔是什么精钮? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任威鹿,我火速辦了婚禮,結(jié)果婚禮上轨香,老公的妹妹穿的比我還像新娘忽你。我一直安慰自己,他們只是感情好臂容,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布檀夹。 她就那樣靜靜地躺著,像睡著了一般策橘。 火紅的嫁衣襯著肌膚如雪炸渡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天丽已,我揣著相機與錄音蚌堵,去河邊找鬼。 笑死沛婴,一個胖子當著我的面吹牛吼畏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘁灯,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泻蚊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑婿?” 一聲冷哼從身側(cè)響起性雄,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羹奉,沒想到半個月后秒旋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡诀拭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年迁筛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕挨。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡细卧,死狀恐怖尉桩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贪庙,我是刑警寧澤魄健,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站插勤,受9級特大地震影響沽瘦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜农尖,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一析恋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盛卡,春花似錦助隧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滓技,卻和暖如春哩牍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背令漂。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工膝昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠必。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓荚孵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纬朝。 傳聞我的和親對象是個殘疾皇子收叶,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • javascript設(shè)計模式與開發(fā)實踐 設(shè)計模式 每個設(shè)計模式我們需要從三點問題入手: 定義 作用 用法與實現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,063評論 0 13
  • 創(chuàng)建型模式 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)...
    隔墻送來秋千影閱讀 2,669評論 0 11
  • 創(chuàng)建型模式 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一共苛。這種類型的設(shè)...
    liuyang7519閱讀 327評論 0 2
  • 風吹麥浪夏日炎判没, 雨潤青梅煮酒天; 穗收稻種忙時節(jié)俄讹, 花謝實成趁熱生哆致。 防暑祛濕勤洗濯, 耗氣傷津終累體患膛; 最怕憂...
    精氣神806閱讀 842評論 0 3