打開百度,搜索“策略”二字,她給你這樣的答案:a、可以實現目標的方案集合;b、根據形勢發展而制定的行動方針和斗爭方法;c、 有斗爭藝術,能注意方式方法;d、 計謀,謀略。e、在作當前決策時即將未來的決策考慮在內的一種計劃。接著,我們開始搜索“模式”二字,不負眾望,她同樣給你一個反饋信息:模式是指從生產經驗和生活經驗中經過抽象和升華提煉出來的核心知識體系。模式(Pattern)其實就是解決某一類問題的方法論。把解決某類問題的方法總結歸納到理論高度,那就是模式。模式是一種指導,在一個良好的指導下,有助于你完成任務,有助于你作出一個優良的設計方案,達到事半功倍的效果,而且會得到解決問題的最佳辦法。
接下來,進入到我們今天的主題,“策略模式”---是一種軟件設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現算法。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法。
我們來看看策略模式的結構圖:
? ? ? ? ?
對上述結構圖進行簡單的解釋說明:
a、將所有的算法都抽象成了Strategy,可以將算法分離出來并且進行更換。
b、Context 中含有對Strategy的引用。
c、通過contextInterface(),進行對算法的使用。
從上面的結構圖中,可以看出這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少各種算法類與使用算法類之間的耦合。換句話說,策略模式并不將算法固定在具體的某個類中,而是將算法獨立出來,可根據需要替換算法。例如:Context中含有對 Straategy的引用。這里還用到了依賴倒轉和里斯代換原則,即Context依賴于抽象,而沒有依賴具體的子類,并且,子類可以替換父類。
下面我們從策略模式的代碼來看,它是如何實現的:
首先,定義一個抽象類(Strategy),作為所有具體算法的公共接口:
? ? ? ? ?
~~~
[csharp]?view?plaincopyprint???
namespace?ConsoleApplication1????
???abstract?class?Strategy?????????//將算法抽象成?Stragedy??????
????????{????
???????????public?override?void?AlgorithmInterface();???????//算法方法????
????????}????
~~~
其次,定義具體的算法或行為,繼承于Strategy:
~~~
[csharp]?view?plaincopyprint???
class?concreteStrategy?:?Strategy???????????????//?定義一個具體算法??????
???????{????
???????????public?override?void?AlgorithmInterface()????????????????//算法的實現方法????
????????{????
????????????Console.WriteLine("算法實現");????
????????}????
???????}????
??
? ? ? ? ? 最后,定義Context對象,通過其ContextInterface(),為其分配不同的算法。
~~~
~~~
[csharp]?view?plaincopyprint???
class?Context???????????????????//?將算法封裝到Context中,通過傳遞對象生成相應子類對象,得到結果????
?{????
???????Strategy?strategy;????????????????//Context?中含有?Strategy的引用????
????
???????public?Context(Strategy?strategy)????//初始化時,傳入具體的Strategy?對象????
???????{????
???????????this.strategy?=?strategy;????
????
???????}????
???????public?void?ContextInterface()???????//根據傳入的對象,調用Context?的ContextInterface?方法????
???????{????
???????????strategy.AlgorithmInterface();????
???????}????
??
? ? ? ? ? 客戶端代碼:實例化策略。
~~~
? ? ? ? ? ?
~~~
[csharp]?view?plaincopyprint???
"white-space:pre">??static?void?Main(string[]?args)????
????????{????
????????????{????
????????????????Context?context;????
????????????????context?=?new?Context(new?concreteStrategy());????
????????????????context.ContextInterface();????
????
????????????????Console.Read();????
????????????}????
~~~
策略模式是一種常見和常用的設計模式,策略的獨立和抽象。常見的場景比如每逢元旦的時候,元辰超市舉辦特價活動,每次到結賬的時候,她都會問你,有會員卡么?因為可以隨著用戶類型的不同,打折的策略也不同。初次接觸策略模式,淺淺的理解,就是兵來將擋,水來土掩;上有政策,下有對策;呼呼,也不知道這種傻傻的理解到底對不對,但是我總會慢慢的理解,慢慢的深入,設計之旅,未完待續......