Strategy 策略模式(行为型模式)
动机(Motivation)
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改算法?将算法与对象本身解耦,从而避免上述问题?
意图(Intent)
定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。该模式使得算法可以独立于使用它的客户而变化。——《设计模式》GoF
示例代码
enum CartType { A, B, C } class Cart { public void Process(CartType cartType) { if (cartType == CartType.A) { ProcessorA(); } else if (cartType == CartType.B) { ProcessorB(); } else if (cartType == CartType.C) { ProcessorC(); } } private void ProcessorA() { //... } private void ProcessorB() { //... } private void ProcessorC() { //... } }
使用策略模式后的代码:
public interface IProcessStrategy//表达算法抽象 { void Process(); } public class ProcessStragegyA : IProcessStrategy { public void Process() { //... } } public class ProcessStragegyB : IProcessStrategy { public void Process() { //... } } public class ProcessStragegyC : IProcessStrategy { public void Process() { //... } } class Cart { private IProcessStrategy processStrategy; public Cart(IProcessStrategy processStrategy) { this.processStrategy = processStrategy; } public void Somemethod1() { //... processStrategy.Process(); //... } public void Somemethod2() { //... processStrategy.Process(); //... } }
客户端调用:
static void Main(string[] args) { Cart cart=new Cart(new ProcessStragegyA());//这里可以通过配置来动态调用 cart.Somemethod1(); }
结构(Structure)
Strategy模式的几个要点
- Strategy及其子类为组件提供了一系列的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。
- Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
- 与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省开销。
转载请注明出处: