設計模式-策略模式(Strategy Pattern)

上一篇 <<<責任鏈模式(Chain of Responsibility Pattern)
下一篇 >>>模板方法模式(Template Pattern)


策略模式:定義了一系列的算法,并將每一個算法封裝起來剪撬,而且使它們還可以相互替換悠反。策略模式讓算法獨立于使用它的客戶而獨立變化馍佑。

策略模式在Spring的使用場景

把多重if判斷分割成多個不同的對象管理

  • ApplicationContext

FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
XmlWebApplicationContext
……

  • Resource

UrlResource:訪問網(wǎng)絡資源的實現(xiàn)類梨水。
ClassPathResource:訪問類加載路徑里資源的實現(xiàn)類。
FileSystemResource:訪問文件系統(tǒng)里資源的實現(xiàn)類舅世。
ServletContextResource:訪問相對于 ServletContext 路徑里的資源的實現(xiàn)類:
InputStreamResource:訪問輸入流資源的實現(xiàn)類奇徒。
ByteArrayResource:訪問字節(jié)數(shù)組資源的實現(xiàn)類。

  • 初始化策略:
    SimpleInstantiationStrategy 簡單初始化策略
    CglibSubclassingInstantiationStrategy CGLIB初始化策略

策略模式在項目中的使用場景

1.聯(lián)合登錄 QQ聯(lián)合登錄/微信聯(lián)合登錄/釘釘聯(lián)合登錄
2.排序算法 冒泡/簡單選擇/堆排序等
3.聚合支付 支付寶/微信支付/銀聯(lián)支付/平安支付等
4.快遞 申通评凝、圓通、京東奕短、德邦匀钧、順豐等
5.發(fā)送通知 短信、微信公眾號模板之斯、釘釘通知、郵件

策略模式優(yōu)缺點

優(yōu)點:
1.算法可以自由切換(高層屏蔽算法莉擒,角色自由切換)
2.避免使用多重條件判斷(如果算法過多就會出現(xiàn)很多種相同的判斷瘫絮,很難維護)
3.擴展性好(可自由添加取消算法 而不影響整個功能)

缺點:
1、所有的策略都需要暴露給外面鹿鳖;
2壮莹、需要配合工廠模式或代理模式;
3命满、代碼量增加

策略模式與狀態(tài)模式的區(qū)別

a、狀態(tài)模式不同狀態(tài)下做的事情不同歼疮,而策略模式做的都是同一件事。
狀態(tài)模式重點在各狀態(tài)之間的切換從而做不同的事情腋妙,而策略模式更側重于根據(jù)具體情況選擇策略讯榕,并不涉及切換。
b济竹、狀態(tài)模式封裝了對象的狀態(tài)霎槐,而策略模式封裝算法或策略。
c丘跌、在狀態(tài)模式中,每個狀態(tài)通過持有Context的引用耸棒,來實現(xiàn)狀態(tài)轉移报辱;但是每個策略都不持有Context的引用,它們只是被Context使用碍现。

策略模式實現(xiàn)方式核心代碼

1. Strategy定義

public interface PayStrategy {
    /**
     * 共同算法實現(xiàn)骨架
     * @return
     */
     public String toPayHtml();
}

2.ConcreteStrategyA定義

@Component
public class AliPayStrategy  implements PayStrategy {
    @Override
    public String toPayHtml() {
        return "調(diào)用支付寶支付接口";
    }
}

3.Context組裝

1)、枚舉+反射

public enum PayEnumStrategy {

    /**
     *  支付寶支付【也可以配置容器中的ID】
     */
    ALI_PAY("cn.jarye.strategy.impl.AliPayStrategy"),
    /**
     *  銀聯(lián)支付【也可以配置容器中的ID】
     */
    UNION_PAY("cn.jarye.strategy.impl.UnionPayStrategy");
    PayEnumStrategy(String className) {
        this.setClassName(className);
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    /**
     * class完整地址
     */
    private String className;

}
public static PayStrategy getPayStrategy(String strategyType) {
    try {
        // 1.獲取枚舉中className
        String className = PayEnumStrategy.valueOf(strategyType).getClassName();
        // 2.使用java反射技術初始化類【也可以根據(jù)容器中的ID獲取bean】
        return (PayStrategy) Class.forName(className).newInstance();
    } catch (Exception e) {
        return null;
    }
}

2)爽篷、數(shù)據(jù)庫配置

// 1.使用PayCode查詢
PaymentChannelEntity paymentChannel = paymentChannelMapper.getPaymentChannel(payCode);
if(paymentChannel==null){
    return  "該渠道為空...";
}
// 2.獲取策略執(zhí)行的beanid
String strategyBeanId = paymentChannel.getStrategyBeanId();
// 3.使用strategyBeanId獲取對應spring容器bean信息
PayStrategy payStrategy = springUtils.getBean(strategyBeanId, PayStrategy.class);

相關文章鏈接:
<<<23種常用設計模式總覽
<<<代理模式(Proxy Pattern)
<<<裝飾模式(Decorator Pattern)
<<<觀察者模式(Observer Pattern)
<<<單例模式(Singleton Pattern)
<<<責任鏈模式(Chain of Responsibility Pattern)
<<<模板方法模式(Template Pattern)
<<<外觀/門面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<適配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工廠相關模式(Factory Pattern)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市一睁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窘俺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘤泪,死亡現(xiàn)場離奇詭異灶泵,居然都是意外死亡对途,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門惶洲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膳犹,“玉大人恬吕,你說我怎么就攤上這事⌒氪玻” “怎么了铐料?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豺旬。 經(jīng)常有香客問我钠惩,道長,這世上最難降的妖魔是什么族阅? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任妻柒,我火速辦了婚禮,結果婚禮上耘分,老公的妹妹穿的比我還像新娘举塔。我一直安慰自己求泰,他們只是感情好央渣,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褥赊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天拔第,我揣著相機與錄音,去河邊找鬼场钉。 笑死蚊俺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逛万。 我是一名探鬼主播泳猬,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了得封?” 一聲冷哼從身側響起埋心,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忙上,沒想到半個月后拷呆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡疫粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年茬斧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片手形。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悯恍,靈堂內(nèi)的尸體忽然破棺而出库糠,到底是詐尸還是另有隱情,我是刑警寧澤涮毫,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布瞬欧,位于F島的核電站,受9級特大地震影響罢防,放射性物質發(fā)生泄漏艘虎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一咒吐、第九天 我趴在偏房一處隱蔽的房頂上張望野建。 院中可真熱鬧,春花似錦恬叹、人聲如沸候生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唯鸭。三九已至,卻和暖如春硅确,著一層夾襖步出監(jiān)牢的瞬間目溉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工菱农, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缭付,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓循未,卻偏偏與公主長得像蛉腌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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