1. 现实需求

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

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. 策略模式-Java实现

    策略模式—Java实现 1. 现实需求 本人现在负责开发和维护考核督办系统,其中一个模块叫编写工作计划.是工作计划就要有时间,我们的各种提醒都做了,但是还是有人把x月的工作计划内容写到y月,真心无语了 ...

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

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

  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. B/S模式获取客户端IP地址

    using System.Web; namespace Common { public class IPUtil { /// <summary> /// 获取IP地址 /// </s ...

  2. Xcode8-beat升级需谨慎

    Xcode8-beat版本在打开xib文件的时候,出现了如下的弹窗 在这里要选择Cancel,选择Choose后xib文件的verson会改变,那么Xcode7就没法打开了(坑队友啦), 更没法运行 ...

  3. Arduino连接SHT10温湿度传感器--返回值不正常解决办法

    如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...

  4. HTTPS与SSL(一)

    1.  HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版 ...

  5. Miner3D Professional专业版

    ——高级的可视化数据分析为专业人士量身打造 Miner3D Professional 专业版可以帮助工程师,研究人员,分析师,管理人员,知识工作者,以分析师和信息专家,在较短的时间内作出更好的判断.探 ...

  6. Invoke 和 BeginInvoke 的区别(转发)

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...

  7. 【Android开发笔记】杂项

    Android studio shift+enter : start new line Theme 将     <style name="AppBaseTheme" pare ...

  8. DB错误代码大全

    db2错误代码大全  sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引 ...

  9. HDU1043 八数码(BFS + 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...

  10. HDU3874 线段树 + 离线处理

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 , 线段树(或树状数组) + 离线处理 下午做了第一道离线处理的题目(HDU4417),多少有点 ...