設計模式之策略模式(行為型模式)


初學設計模式,將學習心得與眾博友分享,如有不正之處還請大家批評指正。

 

   王尼瑪自稱是一個上知天文下知地理的學霸,有天心血來潮報名參加了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#設計模式(李建忠)
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM