索引

  • 意图
  • 结构
  • 参与者
  • 适用性
  • 效果
  • 相关模式
  • 实现
    • 实现方式(一):使用不同的 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(策略) -未经作者同意的转载相关推荐

  1. 【设计模式】2.Strategy 策略模式

    Strategy 策略模式 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也 ...

  2. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

  3. Java的设计模式----strategy(策略模式)

    设计模式: 一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精 ...

  4. Ruby设计模式透析之 —— 策略(Strategy)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8986299 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  5. 设计模式——Strategy(策略)模式

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...

  6. [设计模式] —— Strategy 策略模式

    文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...

  7. 设计模式之Strategy策略模式

    文章目录 前言 一.Strategy策略模式 二.策略模式原则 三.使用场景 1.先做比较练习 2.为一组对象排序 3.使用Lambda表达式的方式 前言 本人对于设计模式的学习,仅供参考! 一.St ...

  8. 设计模式之美:Memento(备忘录)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Memento 模式结构样式代码. 别名 Token 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这 ...

  9. 设计模式之美:Facade(外观)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):用抽象类定义 Facade 而使子类对应于不同的子系统. 意图 为子系统中的一组接口提供一个一致的界面,Facade 模式定义了 ...

最新文章

  1. 教育部:禁止开学前网授新学期课程
  2. docker oracle navicat_拥抱开源从零开始 Docker、Mysql amp; JPA
  3. 捉虫记 单步跟踪 条件断点 变量查看实践
  4. 关于U打包代码必须放到Editor目录下的问题
  5. ruby 安装和管理
  6. 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象
  7. iis7.0 https访问显示403访问被拒绝_提高网站访问性能——Tomcat优化
  8. 饥荒海难创建显示专用服务器,饥荒创建世界时一直显示启动服务器 | 手游网游页游攻略大全...
  9. 前端学习(1132):正则表达式学习目标
  10. 逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门
  11. 线上系统因为一个ThreadLocal直接内存飙升
  12. Git修改已提交的commit
  13. 收费版ESX 与免费版ESXi的区别
  14. 在搜索框里添加放大镜的图标,且显示提示信息
  15. [buuctf.reverse] 131-135
  16. 在计算机中 云 是什么意思,电脑中的云是什么意思?
  17. Python-入门学习
  18. 请求更改配置清除计算机的tpm,受信任的执行环境 ACPI 配置文件
  19. 马斯洛需求理论:找工作的需求层次分析,您在哪个阶段?
  20. 写的几个函数,关键词描红,搜索关键词过滤,生成SQL查询关键词

热门文章

  1. 信息学奥赛一本通 1177:奇数单增序列 | OpenJudge NOI 1.10 02:奇数单增序列
  2. 理论基础 —— 排序
  3. Xor Sum(AtCoder-2272)
  4. 最长公共子序列(信息学奥赛一本通-T1265)
  5. 9 QM配置-检验计划配置-维护检验类型
  6. 3 PP配置-一般设置-检查计量单位
  7. 23 CO配置-控制-产品成本控制-成本对象控制-检查定单类型
  8. python怎么打包_如何打包python程序
  9. MySQL主从失败:slave_IO_Running为No
  10. Integer 与 int 的区别