设计模式之美:Strategy(策略)
2014-03-30 20:30
267 查看
索引
意图
结构
参与者
适用性
效果
相关模式
实现
实现方式(一):使用不同的 Strategy 处理内部状态。
[b]别名[/b]
Policy
[b]意图[/b]
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。
Define a family of algorithms, encapsulate each one, and make them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.
[b]结构[/b]
[b]参与者[/b]
Strategy
定义所有支持的算法的公共接口。Context 使用这个接口来调用 ConcreteStrategy 定义的算法。
ConcreteStrategy
实现 Strategy 接口和具体算法。
Context
用一个 ConcreteStrategy 对象来配置。
维护一个对 Strategy 对象的引用。
可定义一个接口来让 Strategy 访问它的数据。
[b]适用性[/b]
在以下情况下可以使用 Strategy 模式:
许多相关的类仅仅是行为有异。Strategy 提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。
算法使用客户不应该知道的数据。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的 Strategy 类中以代替。
[b]缺点[/b]
客户必须了解不同的 Strategy。要选择合适的 Strategy 就必须知道这些 Strategy 有何不同。
Strategy 和 Context 之间的通信开销。Context 可能创建一些 ConcreteStrategy 不使用的参数。
增加了对象的数目。
[b]效果[/b]
相关算法系列。
一个替代继承的方法。
消除了一些条件语句。
实现的选择。相同行为的不同实现。
[b]相关模式[/b]
使用 Flyweight 模式实现 Strategy。
[b]实现[/b]
实现方式(一):使用不同的 Strategy 处理内部状态。
Strategy 和 Context 接口必须使得 ConcreteStrategy 能够有效的访问它所需要的 Context 中的任何数据。
一种办法是让 Context 将数据放在参数中传递给 Strategy 操作。这使得 Strategy 和 Context 解耦。
但另一方面,Context 可能发送一些 Strategy 不需要的数据。
另一种办法是让 Context 将自身作为一个参数传递给 Strategy,该 Strategy 再显式地向该 Context 请求数据。
或者 Strategy 可以直接保存对 Context 的引用。
这种情况下,Strategy 可以请求到它需要的数据。但这使得 Strategy 和 Context 更紧密的耦合在一起。
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
意图
结构
参与者
适用性
效果
相关模式
实现
实现方式(一):使用不同的 Strategy 处理内部状态。
[b]别名[/b]
Policy
[b]意图[/b]
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。
Define a family of algorithms, encapsulate each one, and make them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.
[b]结构[/b]
[b]参与者[/b]
Strategy
定义所有支持的算法的公共接口。Context 使用这个接口来调用 ConcreteStrategy 定义的算法。
ConcreteStrategy
实现 Strategy 接口和具体算法。
Context
用一个 ConcreteStrategy 对象来配置。
维护一个对 Strategy 对象的引用。
可定义一个接口来让 Strategy 访问它的数据。
[b]适用性[/b]
在以下情况下可以使用 Strategy 模式:
许多相关的类仅仅是行为有异。Strategy 提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。
算法使用客户不应该知道的数据。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的 Strategy 类中以代替。
[b]缺点[/b]
客户必须了解不同的 Strategy。要选择合适的 Strategy 就必须知道这些 Strategy 有何不同。
Strategy 和 Context 之间的通信开销。Context 可能创建一些 ConcreteStrategy 不使用的参数。
增加了对象的数目。
[b]效果[/b]
相关算法系列。
一个替代继承的方法。
消除了一些条件语句。
实现的选择。相同行为的不同实现。
[b]相关模式[/b]
使用 Flyweight 模式实现 Strategy。
[b]实现[/b]
实现方式(一):使用不同的 Strategy 处理内部状态。
Strategy 和 Context 接口必须使得 ConcreteStrategy 能够有效的访问它所需要的 Context 中的任何数据。
一种办法是让 Context 将数据放在参数中传递给 Strategy 操作。这使得 Strategy 和 Context 解耦。
但另一方面,Context 可能发送一些 Strategy 不需要的数据。
另一种办法是让 Context 将自身作为一个参数传递给 Strategy,该 Strategy 再显式地向该 Context 请求数据。
或者 Strategy 可以直接保存对 Context 的引用。
这种情况下,Strategy 可以请求到它需要的数据。但这使得 Strategy 和 Context 更紧密的耦合在一起。
namespace StrategyPattern.Implementation1 { public abstract class Strategy { public abstract void AlgorithmInterface(string state); } public class ConcreteStrategyA : Strategy { public override void AlgorithmInterface(string state) { Console.WriteLine("Use Concrete Strategy A to handle " + state); } } public class ConcreteStrategyB : Strategy { public override void AlgorithmInterface(string state) { Console.WriteLine("Use Concrete Strategy B to handle " + state); } } public class Context { private Strategy _strategy; public void SetStrategy(Strategy strategy) { _strategy = strategy; } public string State { get; set; } public void ContextInterface() { _strategy.AlgorithmInterface(State); } } public class Client { public void TestCase1() { var context = new Context(); context.State = "Hello World"; context.SetStrategy(new ConcreteStrategyA()); context.ContextInterface(); context.SetStrategy(new ConcreteStrategyB()); context.ContextInterface(); } } }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
相关文章推荐
- 设计模式(5)-策略模式Strategy
- 浅谈JAVA设计模式之——策略模式(Strategy)
- java设计模式:策略模式(Strategy)
- JAVA与设计模式--之STRATEGY策略模式
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式之Strategy(策略)
- Java设计模式-策略模式(strategy)
- 03、人人都会设计模式:策略模式--Strategy
- 设计模式--策略模式(Strategy)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式学习之路——Strategy 策略模式
- java 设计模式学习笔记十五 strategy 策略设计模式
- Java设计模式----策略模式(Strategy)
- 设计模式之策略Strategy模式
- 设计模式21 - Strategy 策略模式
- Java设计模式之--策略模式(strategy)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- [导入]C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式.zip(8.00 MB)
- Java设计模式:策略模式 Strategy
- Java设计模式透析之 —— 策略(Strategy)