策略模式定义了算法族,分别封装起来,让它们之间能够互换替换,此模式让算法的变化独立使用算法的客户。html
某公司作了一套模拟鸭子的游戏:该游戏会出现各类鸭子,他们具备类似点(都会叫,会游泳,会表达本身的特征)和异同点(每种展现本身的特征是不一样的方法),很容易想到使用OO技术,定义个鸭子超类,让其余的鸭子类来继承鸭子超类。算法
因为异同点都会展现本身的特征,只是展现特征方式不一样,因此在超类中特征的方法是抽象或者使用一个接口(在此就使用接口,由于每个类都会有展现方法)。下面给出其类图。编程
可当某一天发现了问题,ide
问题1:若是出现了一个DuckC,展现方式和DuckA相同,都是使用相同的方法,那么就会在DuckC类中写了一样的代码,若是那一天想修改他们中的使用相同的方法,就要一个个去修改,若是是有多个的话,就容易出现问题,并且不能到达方法复用的效果。测试
问题2:若是想让一只鸭子须要有两种不一样的展现方式,可能随时改变展现方式,上面的设计就须要修改了spa
问题1为了达到复用,是不可能把全部的展现方式放到Duck类中,由于对应DuckA和DuckB以及DuckC能够随便调用方法,显然是不明智的。.net
先把问题1放一放,咱们来看一下问题2的,能够随时改变,C#中有个属性的思想不就是能够随时改变变量的值。是否是可使用相同的方法来实现呢。每次使用set时,是让值赋给指定的变量,并且能够达到复用的目的(如Person p=new Person();p.Age=22,22是一个int类型中的一个对象,能够屡次使用,并且还能够赋值为23)。一句简单的属性赋值,隐含着多种设计原则。设计
原则一:找出应用中可能须要变化之处,把它们独立出来,不要和那些不须要变化的代码混在一块儿。code
在上面一段简单的代码中,咱们能够把22,23当作计算机为咱们封装好的类型。22和23是被独立出来的会变化的代码。具体的实现咱们不须要知道怎么实现。只须要知道表示的一个数。htm
原则二:针对接口编程,而不是针对实现编程。
先简单的说一下上面的意思:让变的抽象成接口或者抽象类,而后经过单独的类来把接口实现或继承抽象类来实现,而不是将功能直接在代码中实现。
在上面具体的23和22怎么的实现咱们是没有直接写出new int();而是直接获取的类型,其实现交给计算机去处理。
原则三:多使用组合,少使用继承
为何能随时“改变age”,这就是组合的力量,若是是使用继承的话,就不能在一个过程当中改变age。
上面使用整型可能有些不妥,仅仅做为一中理解形式。若是非要找一下策略模式在.net中的踪迹,能够看一下ArrayList的Sort(IComparer comparer)方法,能够参考http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html
有了这三个原则,我以为上面的两个问题应该能够解决了。
使用组合和属性的设计方法来处理
下面列出测试代码:
Duck dA = new DuckA(); IDisplay displayA= dA.GetDisplay(); displayA.Display(); Console.WriteLine("A类鸭子展现方法:"); Console.WriteLine("================================"); Duck dB = new DuckB(); IDisplay displayB = dB.GetDisplay(); Console.WriteLine("B类鸭子展现方法:"); displayB.Display(); Console.WriteLine("================================"); Duck dC = new DuckC(); IDisplay displayC = dC.GetDisplay(); Console.WriteLine("C类鸭子展现方法:"); displayC.Display(); Console.WriteLine("================================"); dC.SetDisplay(new DisplayClassA()); Console.WriteLine("C类鸭子改变方法后展现方法:"); dC.GetDisplay().Display(); Console.Read();
该模式也体现了面向对象的基本特征:封装(把算法一个个封装起来),继承(接口的实现也能够当作是实现类“继承”了接口),多态(在Context调用接口的时间,开始并不知道接口的方法的具体实现,可是知道有个方法,使用的时间就可获取,调用)。
本文主要经过鸭子的设计,引出问题,分析问题,解决问题来体现了策略模式的灵活性,在分析过程当中提出了三个设计原则,结合属性的实现思想来解决了问题。本文是属于读书笔记,可能在理解的地方有误差,但愿可以多多指教!