背景
在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
问题
如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?
方案
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。
比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化。这就是策略模式。
适用情况
许多相关的类仅仅是行为有异。 “策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。
一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
 
优点
1、可以动态的改变对象的行为
缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类
2、策略模式将造成产生很多策略类
 
组成
环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
 
应用
场景如下,刘备要到江东娶老婆了,走之前诸葛亮给赵云三个锦囊妙计,说是按天机拆开能解决棘手问题。场景中出现三个要素:三个妙计(具体策略类)、一个锦囊(环境类)、刘备(调用者)。
 
抽象策略类(Strategy)
public interface Strategy {  public void operate();
} 

三个实现类(ConcreteStrategy):
妙计一:初到吴国
public class BackDoor implements IStrategy {  @Override  public void operate() {  System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");  }
}

妙计二:求吴国太开绿灯放行

1 public class GivenGreenLight implements IStrategy {
2      @Override
3      public void operate() {
4           System.out.println("求吴国太开个绿灯,放行");
5      }
6 } 

妙计三:孙夫人断后,挡住追兵
1 public class BlackEnemy implements IStrategy {
2      @Override
3      public void operate() {
4           System.out.println("孙夫人断后,挡住追兵");
5      }
6 }

环境类(Context)

 1 public class Context {
 2      private Strategy strategy;
 3      //构造函数,要你使用哪个妙计
 4      public Context(Strategy strategy){
 5           this.strategy = strategy;
 6      }
 7      public void setStrategy(Strategy strategy){
 8           this.strategy = strategy;
 9      }
10      public void operate(){
11           this.strategy.operate();
12      }
13 }

下面就是使用的情况了

 1 public class LiuBei {
 2
 3 public static void main(String[] args) {
 4      Context context;
 5
 6      System.out.println("----------刚到吴国使用第一个锦囊---------------");
 7      context = new Context(new BackDoor());
 8      context.operate();
 9      System.out.println("\n");
10
11      System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
12      context.setStrategy(new GivenGreenLight());
13      context.operate();
14      System.out.println("\n");
15
16      System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
17      context.setStrategy(new BlackEnemy());
18      context.operate();
19      System.out.println("\n");
20      }
21 } 

三招下来,搞得的周郎是“赔了夫人又折兵”。
以上就是策略模式,多种不同解决方案动态切换,起到改变对象行为的效果。

转载于:https://www.cnblogs.com/the-wang/p/7323232.html

策略模式(策略不同类,场景不同策略不同,环境策略分离组合)相关推荐

  1. 策略模式总结,适用场景,优缺点,代码示例

    策略模式总结,适用场景,优缺点,代码示例 1.简介 1.1 继承带来的扩展和复用问题 1.2 进一步改进,利用接口 1.3 进一步改进,策略模式 2.适用场景 3.优点 4.缺点 5.代码示例 6.源 ...

  2. c语言支付方式,使用策略模式实现支付方式选择场景

    为了加深对策略模式的理解,本节在来学习一个实例.相信小伙伴们都用过支付宝.微信支付.银联支付及京东白条,常见的应用场景就是大家在下单支付时会提示选择支付方式,如果没有选择支付方式,系统会用默认推荐的支 ...

  3. 策略模式Strategy Pattern应用场景

    策略模式(Strategy Pattern)是指定义了算法家族.分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户. 策略模式的应用场景 1.假如系统中有很多类,而他们的 ...

  4. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  5. 策略模式、观察者模式、代理模式、装饰模式 应用场景和实现

    有个大神写的很好: 参考:设计模式学习笔记(四:策略模式) 参考:设计模式学习笔记(二:观察者模式) 参考:设计模式学习笔记-代理模式 参考:设计模式--装饰者模式与代理模式(重要) 参考:设计模式- ...

  6. 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...

  7. 设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式(Factory pattern) 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是 ...

  8. 拿捏大厂面试,设计模式学习笔记(二)工厂模式、模板模式和策略模式的混合使用

    一.工厂模式 工厂模式又叫做工厂方法模式,是一种创建型设计模式,一般是在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型. 1.1 工厂模式介绍 工厂模式是Java 中比较常见的一种设计模式 ...

  9. 工厂模式和策略模式的综合使用

    目录 一.简单的工厂模式了解与使用 (一)基本概念理解 (二)简单工厂模式的认识和对应角色的分析 基本认识 角色理解 (三)使用场景和典型应用 二.简单的策略模式了解与使用 (一)基本概念理解 (二) ...

  10. java 策略模式会员_七:策略模式(不同等级会员打折算法)

    定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化: 下面给出策略模式的类图,引自百度百科. 策略模式在LZ第一次接触到的时 ...

最新文章

  1. 为什么mac运行变慢,如何提升mac运行速度
  2. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
  3. HDU2044 一只小蜜蜂…(简单递推)
  4. vs2012创建Windows服务
  5. C#——银行ATM程序DEMO
  6. java枚举使用详解
  7. mysql对结果限制_在查询中限制MySQL结果
  8. 自动驾驶车辆转向控制(通过支持转角控制的EPS实现角速度控制)
  9. Access日期、时间函数
  10. 文本视图(UITextView)占位符Swift
  11. C#操作十六进制数据以及十进制与十六进制互相转换
  12. Daily Scrum 10.23
  13. word排版教程-----------技巧
  14. Python及IPython安装使用
  15. 为什么程序员 996 会猝死,而老板 007 却不会?
  16. 带你深入了解 DNS 解析原理-递归与迭代
  17. 水和水蒸气物性计算微信小程序
  18. 验证苹果电子邮件地址服务器出现问题,iPhone之验证您的电子邮件地址问题解决...
  19. 钉钉机器人V1使用说明
  20. 数据分析常见SQL面试笔试题

热门文章

  1. python面向对象(2)——继承(4)
  2. vscode could not establish connection to linux The VS Code Server failed to start
  3. AppleScript 以管理员身份运行程序
  4. hibernate报错 net.sf.json.util.CycleDetectionStrategy$StrictionStrategyRepeatedReferenceAsObject
  5. c语言现代方法16章 基础、课后习题、基础等
  6. c++关联容器的容器操作(和顺序容器都支持的操作)详细解释,基础于c++primer 5th 表 9.2 (持续更新)
  7. c++11-decltype
  8. 关于优酷开放SDk之setOnAdCountListener和setOnNetworkSppedListener
  9. Servlet异常处理
  10. spring autoproxy by annotation