2.策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。
环境角色:持有一个策略类的引用,最终给客户端调用。
示例:
Stategy(抽象策略类)定义了一个公共接口,各种不同的算法以不同的方法实现这个接口,context使用这个接口调用不同的算法,一般使用接口或者抽象类实现。
//抽象算法类 public abstract class Starategy { //算法方法 public abstract void AlgorithmInterface(); }
具体策略类:实现Stategy定义的接口,提供具体的算法实现
//具体算法A public class ConcreteStrategyA:Starategy { public override void AlgorithmInterface() { //do somthing } }
Context应用场景:
//用一个算法类来配置,维护一个对Strategy对象的引用 public class Context { Starategy star; //初始化,传入具体的策略对象 public Context(Starategy star) { this.star = star; } //根据具体的策略对象,调用其算法的方法 public void ContextInterface() { star.AlgorithmInterface(); } }
客户端实现
Context context = new Context(new ConcreteStrategyA()); context.ContextInterface();
策略模式与简单工厂模式
public class Context { CashSuper cs = null; public Context(string type) { switch (type) { case "正常收费": CashNormal cs0 = new CashNormal(); break; case "打八折": CashRebate cs1 = new CashRebate("0.8"); break; } } public double CetResult(double money) { return cs.acceptCash(money); } }
客户端调用
CashContext csuper=new CashCont("0.8");
策略模式是之中定义一些列算法的方法,从概念上看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所用的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法和行为,继承有助于析取出这些算法中的公共功能。
优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。