打开百度,搜索“策略”二字,她给你这样的答案:a、可以实现目标的方案集合;b、根据形势发展而制定的行动方针和斗争方法;c、 有斗争艺术,能注意方式方法;d、 计谋,谋略。e、在作当前决策时即将未来的决策考虑在内的一种计划。接着,我们开始搜索“模式”二字,不负众望,她同样给你一个反馈信息:模式是指从生产经验和生活经验中经过抽象和升华提炼出来的核心知识体系。模式(Pattern)其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果,而且会得到解决问题的最佳办法。
接下来,进入到我们今天的主题,“策略模式”---是一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
我们来看看策略模式的结构图:
对上述结构图进行简单的解释说明:
a、将所有的算法都抽象成了Strategy,可以将算法分离出来并且进行更换。
b、Context 中含有对Strategy的引用。
c、通过contextInterface(),进行对算法的使用。
从上面的结构图中,可以看出这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。换句话说,策略模式并不将算法固定在具体的某个类中,而是将算法独立出来,可根据需要替换算法。例如:Context中含有对 Straategy的引用。这里还用到了依赖倒转和里斯代换原则,即Context依赖于抽象,而没有依赖具体的子类,并且,子类可以替换父类。
下面我们从策略模式的代码来看,它是如何实现的:
首先,定义一个抽象类(Strategy),作为所有具体算法的公共接口:
[csharp] view plaincopyprint? namespace ConsoleApplication1 abstract class Strategy //将算法抽象成 Stragedy { public override void AlgorithmInterface(); //算法方法 }
其次,定义具体的算法或行为,继承于Strategy:
[csharp] view plaincopyprint? class concreteStrategy : Strategy // 定义一个具体算法 { public override void AlgorithmInterface() //算法的实现方法 { Console.WriteLine("算法实现"); } }
最后,定义Context对象,通过其ContextInterface(),为其分配不同的算法。
[csharp] view plaincopyprint? class Context // 将算法封装到Context中,通过传递对象生成相应子类对象,得到结果 { Strategy strategy; //Context 中含有 Strategy的引用 public Context(Strategy strategy) //初始化时,传入具体的Strategy 对象 { this.strategy = strategy; } public void ContextInterface() //根据传入的对象,调用Context 的ContextInterface 方法 { strategy.AlgorithmInterface(); }
客户端代码:实例化策略。
[csharp] view plaincopyprint? <span style="white-space:pre"> </span>static void Main(string[] args) { { Context context; context = new Context(new concreteStrategy()); context.ContextInterface(); Console.Read(); }
策略模式是一种常见和常用的设计模式,策略的独立和抽象。常见的场景比如每逢元旦的时候,元辰超市举办特价活动,每次到结账的时候,她都会问你,有会员卡么?因为可以随着用户类型的不同,打折的策略也不同。初次接触策略模式,浅浅的理解,就是兵来将挡,水来土掩;上有政策,下有对策;呼呼,也不知道这种傻傻的理解到底对不对,但是我总会慢慢的理解,慢慢的深入,设计之旅,未完待续......