22 行為型 策略模式 Strategy

2022-09-11 03:36:10 字數 1722 閱讀 2120

實際專案:

1、有各種鴨子,各個鴨子不同行為,顯示出來;

2、商場打折、**滿減、積分兌換等活動

基本介紹:

1、策略模式(strategy):它定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。

2、這演算法體現了幾個設計原則:

原理類圖:

/** * @description: 策略介面類

* @remark: 定義所有演算法或者行為的抽象介面

*/class strategy

;/**

* @description: 具體策略實現類

* @remark: 實現具體的演算法或者行為,繼承於strategy類

*/class concretestrategya: public strategy

};class concretestrategyb: public strategy

};class concretestrategyc: public strategy

};/**

* @description: context上下文

* @remark: 用乙個contextstrategy來配置,維護乙個對strategy物件的引用

*/class strategycontext

void contextstrategy()

private:

strategy* m_pstrategy;

};int main()

思路分析:1、「商場收銀時如何**,用打折還是返利,其實都是一些演算法,用工廠來生成演算法物件,這沒有錯,但演算法本身只是一種策略,最重要的是這些演算法是隨時都可能互相替換的,這就是變化點,而封裝變化點是我們物件導向的一種很重要的思維方式

2、策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合

3、優點是簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試;

4、結合工廠模式和「反射技術」,策略模式應用起來會更加方便;

注意事項和細節:

1、策略模式的關鍵是:分析專案中變化部分與不變部分;

2、核心思想:多用組合/聚合,少用繼承,用行為類組合,而不是行為的繼承,更有彈性;

3、體現了「開閉原則」,客戶端增加行為不用修改原有**,只是增加一種策略(行為)即可;避免了使用多重轉移語句(if else)

4、提供了可以替換繼承關係的辦法:策略模式將演算法封裝在獨立的strategy類中使你可以獨立於其context改變它,是他易於切換,易於理解,易於擴充套件;

5、注意的是:每新增乙個策略就要增加乙個類,當策略過多是會導致類數目龐大;

來自為知筆記(wiz)

策略模式(行為型)

思考問題 乙個書店的某類書是免費的,某類書是固定1元的,某類書是按折扣算的 比如88 同一類別的書本 一樣 假定顧客只買一類書,在設計書店bookstore類時應該如何計算顧客買書的費用?解答 1.你有可能不知道如何設計,畢竟上面的計算規則不一樣 並不是一類書8折另一類書9折那樣好計算 2.既然這樣...

行為型 策略模式

注入物件,改變行為。這是乙個很有意思的模式,它可以有多種表現形式,只要滿足注入物件,改變行為。學習這個模式,必須忘記網上和書上的標準類圖。注入不同的comparator,排序的方式也不同。這是最常見的策略模式的表現形式,沒必要畫什麼圖。與上乙個策略模式比較,有點主客顛倒的意思。class beanc...

行為型(一) 策略模式

1 定義 define a family of algorithms,encapsulate each one,and make them interchangeable.定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。2 使用場景 多個類只是在演算法或行為上稍有不同 演算法需要自由...