初学设计模式,将学习心得与众博友分享,如有不正之处还请大家批评指正。

 

   王尼玛自称是一个上知天文下知地理的学霸,有天心血来潮报名参加了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#设计模式(李建忠)
 
posted on 2014-05-15 11:20  sanduo_lei  阅读(2447)  评论(4编辑  收藏  举报