您的位置:首页 > 其它

设计模式笔记 22. Strategy 策略模式(行为型模式)

2008-09-24 18:42 441 查看
22. Strategy 策略模式

2008-09-24

动机(Motivation)

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?

意图(Intent)

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。 ——《设计模式》GoF

如果除去Context类,这个模式几乎跟模板方法一样,可以看到,策略模式只是比模板方法模式多了一个Context类这个包装器。
//抽象算法类

abstract class Strategy

//具体算法A

class ConcreteStrategyA : Strategy

//具体算法B

class ConcreteStrategyB : Strategy

//具体算法C

class ConcreteStrategyC : Strategy

//上下文

class Context

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();

Console.Read();

}

}

Strategy的几个要点:

Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。

Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: