博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式基础】行为模式 - 5 - 策略(Strategy)
阅读量:4006 次
发布时间:2019-05-24

本文共 2262 字,大约阅读时间需要 7 分钟。

1. 模式意图

策略模式别名Policy。

策略模式的意图是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。

策略模式使得算法可以在不影响客户端的情况下发生变化。

使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的变化时,只需要实现新的策略类,并在客户端登记即可。

Note:策略模式并不决定何时使用何种算法(策略)

策略模式 V.S. 桥接模式

  • Strategy模式注重于算法的封装;
  • Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现;

2. 模式定义

Context(上下文,环境):            用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口让Strategy访问它的数据;

抽象策略(Strategy):                   定义一个接口或抽象类实现;定义所有支持的算法的公共接口;Context使用这个接口来调用某ConcreteStrategy定义的算法;

具体策略(ConcreteStretegy):  以Strategy接口实现某具体算法;

3. 模式实现

3.1 C#实现策略模式

// Strategy pattern -- Structural example  using System;// "Strategy"abstract class Strategy{  // Methods  abstract public void AlgorithmInterface();}// "ConcreteStrategyA"class ConcreteStrategyA : Strategy{  // Methods  override public void AlgorithmInterface()  {    Console.WriteLine("Called ConcreteStrategyA.AlgorithmInterface()");  }}// "ConcreteStrategyB"class ConcreteStrategyB : Strategy{  // Methods  override public void AlgorithmInterface()  {    Console.WriteLine("Called ConcreteStrategyB.AlgorithmInterface()");  }}// "ConcreteStrategyC"class ConcreteStrategyC : Strategy{  // Methods  override public void AlgorithmInterface()  {    Console.WriteLine("Called ConcreteStrategyC.AlgorithmInterface()");  }}// "Context"class Context{  // Fields  Strategy strategy;  // Constructors  public Context( Strategy strategy )  {    this.strategy = strategy;  }  // Methods  public void ContextInterface()  {    strategy.AlgorithmInterface();  }}/// /// Client test/// public class Client{  public static void Main( string[] args )  {    // Three contexts following different strategies    Context c = new Context( new ConcreteStrategyA() );    c.ContextInterface();    Context d = new Context( new ConcreteStrategyB() );    d.ContextInterface();    Context e = new Context( new ConcreteStrategyC() );    e.ContextInterface();  }}

4. 模式应用

4.1 何时使用策略模式

  • 如果在一个系统里面有许多类,他们之间的区别仅在于他们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  • 一个系统需要动态地在几种算法中选择几种。那么这些算法可以包装到一个个的具体的算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态原则,客户端可以选择使用任何一个具体算法类,并只持有一个抽象算法类的对象。
  • 一个系统的算法使用的数据不可以让客户端知道;策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
  • 如果一个对象有很多的行为,如果使用不恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。

你可能感兴趣的文章
北京联通华为光猫HG8346R破解改桥接
查看>>
python使用win32*模块模拟人工操作——城通网盘下载器(一)
查看>>
python append 与浅拷贝
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
2017阿里内推笔试题--算法工程师(运筹优化)
查看>>
python自动化工具之pywinauto(零)
查看>>
python自动化工具之pywinauto(四)——批量转换exe视频
查看>>
python一句话之利用文件对话框获取文件路径
查看>>
PaperDownloader——文献命名6起来
查看>>
PaperDownloader 1.5.1——更加人性化的文献下载命名解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
查看>>
JVM最简生存指南
查看>>
漂亮的代码,糟糕的行为——解决Java运行时的内存问题
查看>>
Java的对象驻留
查看>>
自己动手写GC
查看>>
10个精妙的Java编码最佳实践
查看>>
Java 8新特性终极指南
查看>>
logback高级特性使用(二) 自定义Pattern模板
查看>>