初学设计模式,将学习心得与众博友分享,如有不正之处还请大家批评指正。
王尼玛自称是一个上知天文下知地理的学霸,有天心血来潮报名参加了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#设计模式(李建忠)