策略,就是说我们根据不同的需要采用不同的方式,例如,机房收费系统中的收费,有固定和临户两种用户,我们采取的收费方式是不一样的。
那么什么是策略模式呢?
策略模式(Strategy):是指定义了一系列算法家族,并将每个算法分别封装起来,让它们之间可以互相替换。此模式让算法的变化,不会影响到使用算法的客户。看下面策略模式的结构图:
说明:
1.将所有的算法都抽象成了Strategy,可以将算法分离出来并且进行更换。
2.Context 中含有对Strategy的引用。
3通过contextInterface(),进行对算法的使用。
从上面的结构图中,可以看出这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。换句话说,策略模式并不将算法“绑死”在具体的某个类中,而是将算法独立出来,可根据需要替换算法。例如:Context中含有对 Straategy的引用。这里还用到了依赖倒转和里斯代换原则,即Context依赖于抽象,而没有依赖具体的子类,并且,子类可以替换父类。
优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
下面我们从策略模式的代码来看,它是如何实现的:
首先,定义一个抽象类(Strategy),作为所有具体算法的公共接口。
namespace ConsoleApplication1 abstract class Strategy //将算法抽象成 Stragedy { public override void AlgorithmInterface(); //算法方法 }
其次,定义具体的算法或行为,继承于Strategy。
class concreteStrategy : Strategy // 定义一个具体算法 { public override void AlgorithmInterface() //算法的实现方法 { Console.WriteLine("算法实现"); } }
最后,定义Context对象,通过其ContextInterface(),为其分配不同的算法。
class Context // 将算法封装到Context中,通过传递对象生成相应子类对象,得到结果 { Strategy strategy; //Context 中含有 Strategy的引用 public Context(Strategy strategy) //初始化时,传入具体的Strategy 对象 { this.strategy = strategy; } public void ContextInterface() //根据传入的对象,调用Context 的ContextInterface 方法 { strategy.AlgorithmInterface(); }
客户端代码:实例化策略
static void Main(string[] args) { { Context context; context = new Context(new concreteStrategy()); context.ContextInterface(); Console.Read(); }