初學設計模式,將學習心得與眾博友分享,如有不正之處還請大家批評指正。
王尼瑪自稱是一個上知天文下知地理的學霸,有天心血來潮報名參加了CCAV的《開心闖關》。到他上場了,主持人王二丫開始了第一題:吳敬梓是哪本名著的作者?王尼瑪脫口而出:儒林外史。OYEAH,學霸果然是學霸,答對。請聽第二題:最早的血壓計用於測量誰的血壓?馬,王尼瑪也順利答出。后面幾道題王尼瑪也都順利通過,主持人一看這勢頭分明是要拿走萬元大獎的節奏啊,最后一題了趕緊翻出極難的:請問世上最苦逼的職業是什么?王尼瑪一聽即傻眼了,數以萬計的職業到底哪個才是呀?急的直冒汗。正當二丫得意的時候,王尼瑪決定求助親友,眼看到手的獎金怎么能泡湯呢。隨即撥通了摯友王尼美的電話,一聽這題王尼美直接飛出六個字:程序猿不解釋。最終王尼瑪用了王尼美的答案使得全部通過,抱得萬元大獎。王尼瑪的機智打動了在場的所有人,掌聲經久不息。
樓主自娛自樂編了這個段子,難道你沒發現這不就是策略模式的例子嗎?請呵呵~
概念:
策略模式(Strategy Pattern)定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
組成:
- 抽象策略角色: 策略類,通常由一個接口或者抽象類實現。
- 具體策略角色:包裝了相關的算法和行為。
- 環境角色:(Context類)持有一個策略類的引用,最終給客戶端調用。
UML結構圖:

適用場景:
1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。
那么現在我們將上面的小段子用程序簡單的來表示一下
類關系圖:

代碼:(很簡單就不做注釋了,Sorry~)
1 /// <summary> 2 /// Strategy類 3 /// </summary> 4 abstract class Answer 5 { 6 public abstract void GetAnswer(); 7 } 8 9 class Computer : Answer 10 { 11 public override void GetAnswer() 12 { 13 Console.WriteLine("使用計算機可以獲知正確答案"); 14 } 15 } 16 class Friend : Answer 17 { 18 public override void GetAnswer() 19 { 20 Console.WriteLine("求助朋友可以獲知正確答案"); 21 } 22 } 23 class Himself : Answer 24 { 25 public override void GetAnswer() 26 { 27 Console.WriteLine("憑借他自己的記憶可以獲知正確答案"); 28 } 29 } 30 /// <summary> 31 /// Context類 32 /// </summary> 33 class Player 34 { 35 private Answer answer; 36 public Player(Answer answer) 37 { 38 this.answer = answer; 39 } 40 public void Operation() 41 { 42 answer.GetAnswer(); 43 } 44 } 45 46 /// <summary> 47 /// 客戶端調用 48 /// </summary> 49 class 策略模式 50 { 51 public static void Main() 52 { 53 Player player = new Player(new Friend()); 54 player.Operation(); 55 Console.ReadLine(); 56 } 57 }
參考資料:
- 百度百科:策略模式
- C#設計模式(李建忠)