设计模式笔记(24)---访问者模式(行为型)
2010-02-02 22:20
861 查看
Gof定义
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客 户而变化。动机
在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?看下面的策略者模式的结构图和基本代码,策略者模式比较简单,下面只是给出基本的代码实现。策略者模式结构图:
![](http://img1.51cto.com/attachment/201211/225147370.png)
基本实现代码:
/// <summary> /// 抽象算法类 /// </summary> public abstract class Strategy { //抽象算法方法 public abstract void AlgorithmInterface(); } /// <summary> /// 具体算法A /// </summary> public class ConcretestrategyA : Strategy { public override void AlgorithmInterface() { Console.WriteLine("算法A的实现"); } } /// <summary> /// 具体算法B /// </summary> public class ConcretestrategyB : Strategy { public override void AlgorithmInterface() { Console.WriteLine("算法B的实现"); } } /// <summary> /// 具体算法C /// </summary> public class ConcretestrategyC : Strategy { public override void AlgorithmInterface() { Console.WriteLine("算法C的实现"); } } /// <summary> /// 上下文 /// </summary> public class Context { private Strategy _strategy; public Context(Strategy stragtety) { this._strategy = stragtety; } public void ContextInterface() { _strategy.AlgorithmInterface(); } } /// <summary> /// 客户端代码 /// </summary> class Program { static void Main(string[] args) { Context context; context = new Context(new ConcretestrategyA()); context.ContextInterface(); context = new Context(new ConcretestrategyB()); context.ContextInterface(); context = new Context(new ConcretestrategyC()); context.ContextInterface(); } }
运行结果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/03/f6b10898b9e774de6538c7fad8a6f3d5.png)
当有新的算法需求时,只需要添加一个具体的算法类继承抽象算法类即可,如下:
/// <summary> /// 具体算法D /// </summary> public class ConcretestrategyD: Strategy { public override void AlgorithmInterface() { Console.WriteLine("算法D的实现"); } }
然后只需要改动客户端的代码就可以了,代码如下:
/// <summary> /// 客户端代码 /// </summary> class Program { static void Main(string[] args) { Context context; context = new Context(new ConcretestrategyA()); context.ContextInterface(); context = new Context(new ConcretestrategyB()); context.ContextInterface(); context = new Context(new ConcretestrategyC()); context.ContextInterface(); context = new Context(new ConcretestrategyD()); context.ContextInterface(); } }
运行结果如下:
![](http://img1.51cto.com/attachment/201211/225215499.png)
Strategy模式的几个要点
Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
相关文章推荐
- 设计模式笔记(24)---访问者模式(行为型)
- 设计模式笔记(24)---访问者模式(行为型)
- 设计模式笔记 23. Visitor 访问者模式(行为型模式)
- "围观"设计模式(24)--行为型之访问者模式(Visitor Pattern)
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(一)
- 设计模式笔记24:访问者模式(Visitor Pattern)
- 设计模式笔记24:访问者模式(Visitor Pattern)
- [导入]C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.zip(10.41 MB)
- 设计模式笔记(24)---访问者模式(行为型)
- java/android 设计模式学习笔记(24)---访问者模式
- 设计模式24——行为型模式之访问者模式
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(二)
- 设计模式24——行为型模式之访问者模式
- [设计模式笔记]三. 行为型模式--24. Template Method模式(模板方法)类行为型模式(一)
- 设计模式笔记 15. Interpreter 解释器模式(行为型模式)
- 设计模式笔记 18. Observer 观察者模式(行为型模式)
- 设计模式笔记--行为型模式之七Observer--观察者
- 设计模式_24:访问者模式
- C#面向对象设计模式纵横谈 学习笔记22 State模式(行为型模式)
- 设计模式笔记--行为型模式-之三 解释器