设计模式之美:Strategy(策略) -未经作者同意的转载
索引
- 意图
- 结构
- 参与者
- 适用性
- 效果
- 相关模式
- 实现
- 实现方式(一):使用不同的 Strategy 处理内部状态。
别名
- Policy
意图
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。
Define a family of algorithms, encapsulate each one, and make them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.
结构
参与者
Strategy
- 定义所有支持的算法的公共接口。Context 使用这个接口来调用 ConcreteStrategy 定义的算法。
ConcreteStrategy
- 实现 Strategy 接口和具体算法。
Context
- 用一个 ConcreteStrategy 对象来配置。
- 维护一个对 Strategy 对象的引用。
- 可定义一个接口来让 Strategy 访问它的数据。
适用性
在以下情况下可以使用 Strategy 模式:
- 许多相关的类仅仅是行为有异。Strategy 提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。
- 算法使用客户不应该知道的数据。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关条件分支移入它们各自的 Strategy 类中以代替。
缺点
- 客户必须了解不同的 Strategy。要选择合适的 Strategy 就必须知道这些 Strategy 有何不同。
- Strategy 和 Context 之间的通信开销。Context 可能创建一些 ConcreteStrategy 不使用的参数。
- 增加了对象的数目。
效果
- 相关算法系列。
- 一个替代继承的方法。
- 消除了一些条件语句。
- 实现的选择。相同行为的不同实现。
相关模式
- 使用 Flyweight 模式实现 Strategy。
实现
实现方式(一):使用不同的 Strategy 处理内部状态。
Strategy 和 Context 接口必须使得 ConcreteStrategy 能够有效的访问它所需要的 Context 中的任何数据。
一种办法是让 Context 将数据放在参数中传递给 Strategy 操作。这使得 Strategy 和 Context 解耦。
但另一方面,Context 可能发送一些 Strategy 不需要的数据。
另一种办法是让 Context 将自身作为一个参数传递给 Strategy,该 Strategy 再显式地向该 Context 请求数据。
或者 Strategy 可以直接保存对 Context 的引用。
这种情况下,Strategy 可以请求到它需要的数据。但这使得 Strategy 和 Context 更紧密的耦合在一起。
1 namespace StrategyPattern.Implementation1 2 { 3 public abstract class Strategy 4 { 5 public abstract void AlgorithmInterface(string state); 6 } 7 8 public class ConcreteStrategyA : Strategy 9 { 10 public override void AlgorithmInterface(string state) 11 { 12 Console.WriteLine("Use Concrete Strategy A to handle " + state); 13 } 14 } 15 16 public class ConcreteStrategyB : Strategy 17 { 18 public override void AlgorithmInterface(string state) 19 { 20 Console.WriteLine("Use Concrete Strategy B to handle " + state); 21 } 22 } 23 24 public class Context 25 { 26 private Strategy _strategy; 27 28 public void SetStrategy(Strategy strategy) 29 { 30 _strategy = strategy; 31 } 32 33 public string State { get; set; } 34 35 public void ContextInterface() 36 { 37 _strategy.AlgorithmInterface(State); 38 } 39 } 40 41 public class Client 42 { 43 public void TestCase1() 44 { 45 var context = new Context(); 46 context.State = "Hello World"; 47 48 context.SetStrategy(new ConcreteStrategyA()); 49 context.ContextInterface(); 50 51 context.SetStrategy(new ConcreteStrategyB()); 52 context.ContextInterface(); 53 } 54 } 55 }
设计模式之美:Strategy(策略) -未经作者同意的转载相关推荐
- 【设计模式】2.Strategy 策略模式
Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...
- 设计模式学习笔记--Strategy 策略模式
所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...
- Ruby设计模式透析之 —— 策略(Strategy)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8986299 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- 设计模式——Strategy(策略)模式
目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...
- [设计模式] —— Strategy 策略模式
文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...
- 设计模式之Strategy策略模式
文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...
- 设计模式之美:Memento(备忘录)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Memento 模式结构样式代码. 别名 Token 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这 ...
- 设计模式之美:Facade(外观)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...
最新文章
- 教育部:禁止开学前网授新学期课程
- docker oracle navicat_拥抱开源从零开始 Docker、Mysql amp; JPA
- 捉虫记 单步跟踪 条件断点 变量查看实践
- 关于U打包代码必须放到Editor目录下的问题
- ruby 安装和管理
- 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象
- iis7.0 https访问显示403访问被拒绝_提高网站访问性能——Tomcat优化
- 饥荒海难创建显示专用服务器,饥荒创建世界时一直显示启动服务器 | 手游网游页游攻略大全...
- 前端学习(1132):正则表达式学习目标
- 逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门
- 线上系统因为一个ThreadLocal直接内存飙升
- Git修改已提交的commit
- 收费版ESX 与免费版ESXi的区别
- 在搜索框里添加放大镜的图标,且显示提示信息
- [buuctf.reverse] 131-135
- 在计算机中 云 是什么意思,电脑中的云是什么意思?
- Python-入门学习
- 请求更改配置清除计算机的tpm,受信任的执行环境 ACPI 配置文件
- 马斯洛需求理论:找工作的需求层次分析,您在哪个阶段?
- 写的几个函数,关键词描红,搜索关键词过滤,生成SQL查询关键词