策略模式—Java实现

1. 现实需求

本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划。是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了!可能有人会说,让客户直接把错误的工作计划全部修改正确不就行了,但是你想客户会愿意吗?客户永远是想做最少的事带来最多的效果。

好吧,那就是直接修改时间。这时问题来了,如果你修改的时间下,已经有了工作计划怎么办?是覆盖,还是合并,还是……。这时我们需要给客户提供策略供其选择。当然,具体业务还有很多限制,这里不具体描述了。可能我们没有想全所有的情况,或客户有了新的需求,这时我们直接新增策略即可,改很少的代码。基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合。

2. 策略模式定义

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

3. 设计原则
      设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口然后在类中包  含这  个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。 
      策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响
到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

4. 策略模式中有三个对象:
(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2) 抽象策略对象:它可由接口或抽象类来实现。
(3)  具体策略对象:它封装了实现同不功能的不同算法。
    利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5. 为了方便大家理解,还是我们以大多网络上的实例讲解。

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?

类图:

项目结构:

具体代码

  1. package chengxuyuanzhilu.com.sp;
  2.  
  3. /**
  4. * @author 微信公众号:程序员之路
  5. * 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。
  6. */
  7. public interface IStrategy {
  8. //每个锦囊妙计都是一个可执行的算法。
  9. public void operate();
  10. }
  11.  
  12. package chengxuyuanzhilu.com.sp.imp;
  13.  
  14. import chengxuyuanzhilu.com.sp.IStrategy;
  15.  
  16. /**
  17. * @author 微信公众号:程序员之路
  18. * 找乔国老帮忙,使孙权不能杀刘备
  19. */
  20. public class BackDoor implements IStrategy {
  21.  
  22. @Override
  23. public void operate() {
  24. System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
  25. }
  26.  
  27. }
  28.  
  29. package chengxuyuanzhilu.com.sp.imp;
  30.  
  31. import chengxuyuanzhilu.com.sp.IStrategy;
  32.  
  33. /**
  34. * @author 微信公众号:程序员之路
  35. * 孙夫人断后,挡住追兵
  36. */
  37. public class BlackEnemy implements IStrategy {
  38.  
  39. @Override
  40. public void operate() {
  41. System.out.println("孙夫人断后,挡住追兵...");
  42. }
  43.  
  44. }
  45.  
  46. package chengxuyuanzhilu.com.sp.imp;
  47.  
  48. import chengxuyuanzhilu.com.sp.IStrategy;
  49.  
  50. /**
  51. * @author 微信公众号:程序员之路
  52. * 求吴国太开个绿灯
  53. */
  54. public class GivenGreenLight implements IStrategy {
  55.  
  56. @Override
  57. public void operate() {
  58. System.out.println("求吴国太开个绿灯,放行!");
  59. }
  60.  
  61. }
  62.  
  63. package chengxuyuanzhilu.com.sp;
  64.  
  65. /**
  66. * @author 微信公众号:程序员之路
  67. * 放策略的锦囊
  68. */
  69. public class Context {
  70. //接口的好处就在于它可以指向实现了它的任意实现类
  71. private IStrategy strategy;
  72.  
  73. //通过锦囊的构造函数,去指定具体要选择哪条策略去处理遇到的危险
  74. public Context(IStrategy strategy) {
  75. this.strategy = strategy;
  76. }
  77.  
  78. public void operate(){
  79. this.strategy.operate();
  80. }
  81. }
  82.  
  83. package chengxuyuanzhilu.com.sp;
  84.  
  85. import chengxuyuanzhilu.com.sp.imp.BackDoor;
  86. import chengxuyuanzhilu.com.sp.imp.BlackEnemy;
  87. import chengxuyuanzhilu.com.sp.imp.GivenGreenLight;
  88.  
  89. /**
  90. * @author 微信公众号:程序员之路
  91. * 赵云就是我们现实生活中的客户
  92. */
  93. public class ZhaoYun {
  94. /**
  95. * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
  96. */
  97. public static void main(String[] args) {
  98. Context context;
  99.  
  100. //刚到吴国的时候拆开第一个
  101. System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
  102. context = new Context(new BackDoor());
  103. context.operate();//拆开执行
  104. System.out.println("\n");
  105.  
  106. //当刘备乐不思蜀时,拆开第二个
  107. System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
  108. context = new Context(new GivenGreenLight());
  109. context.operate();//拆开执行
  110. System.out.println("\n");
  111.  
  112. //孙权的小追兵了,咋办?拆开第三个锦囊
  113. System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
  114. context = new Context(new BlackEnemy());
  115. context.operate();//拆开执行
  116. System.out.println("\n");
  117. }
  118.  
  119. }

执行结构:

策略模式-Java实现的更多相关文章

  1. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  2. 策略模式—Java实现(转)

    1. 现实需求 客户有了新的需求,这时我们直接新增策略即可,改很少的代码.基本符合我们面向对象原则中的开闭原则(对扩展开放,对修改关系),实现了高内聚低耦合. 2. 策略模式定义 策略模式,又叫算法簇 ...

  3. 策略模式--Java篇

    策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 下面将以商场打折为例子,说明策略模式.商场收银如何促销,用打折还是 ...

  4. StrategyPattern(策略模式)-----Java/.Net

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

  5. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  6. JDK设计模式之——策略模式(Comparable和Comparator接口)

    策略模式:其实就是java的多态...父类引用指向子类对象. 使用策略模式,改善排序算法上文中需要排序的是一个数组 让他可以对任何类型的数组进行排序 1.利用 接口 Comparable<T&g ...

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

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. Java设计模式1——策略模式(Strategy Pattern)

    最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解, ...

随机推荐

  1. java 与C# 时间格式 交互

    方法一 C#端代码 IsoDateTimeConverter convert = new IsoDateTimeConverter(); string ret = JsonConvert.Serial ...

  2. ONVIF学习-ONVIF开发框架搭建(C++)

    第一步.下载gsoap 从gsoap官网(http://www.genivia.com/products.html#notice)下载最新版gsoap(博主用的是gsoap_2.8.45).gsoap ...

  3. 20145324 《Java程序设计》第10周学习总结

    20145324 <Java程序设计>第10周学习总结 教材学习内容总结 1.网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输 2.在实际传输数据以前需要将域名转换为IP地 ...

  4. 20145324 《Java程序设计》第9周学习总结

    20145324 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作 ...

  5. 从零开始玩转JMX(一)——简介和Standard MBean

    JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Level,服 ...

  6. PHP设计模式(五): 原型模式

  7. Mac OS build caffe2 Error:This file was generated by an older version of protoc which is

    问题所在 我们可以发现这个错误跟protobuf的版本有关,因此我们可以执行script/diagnose_protobuf.py 我们可以看到,pip install protobuf 和 brew ...

  8. .NET中常见的锁 笔记

    Lock.Monitor lock和Monitor的区别 1.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 2.Monitor有TryEnter的功能,可 ...

  9. HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (二)

    接上篇 HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (一) 整个 ppt 可以去这里下载. 这一篇主要从服务端应该如何返回合理的返回值的角度,讨论如何设计一个合理的 HTTP ...

  10. Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException

    这个版本默认是开启了保护模式,进入redis的文件夹下的src 输入(前提是得开启redis服务): ./redis-cli config set protected-mode "no&qu ...