1. 应用场景

当系统能在几种算法中快速地切换,或系统中有一些类,它们仅行为不同时,或系统中存在多重条件选择语句时,可以考虑采用策略模式。找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

2. 概念

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算的客户。

3. Class Diagram

  • Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
  • Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。

4.与状态模式的比较

状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。

状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。

5. Implementation

设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。

public interface QuackBehavior {void quack();
}public interface FlyBehavior {public void fly();
}public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("quack");}
}public class Squeak implements QuackBehavior {@Overridepublic void quack() {System.out.println("Squack!");}
}public class FlyWithWings implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm flying");}
}public class FlyRecoketPowered implements FlyBehavior {@Overridepublic void fly() {System.out.println("I'm flying with a rocket");}
}public class FlyNoWay implements FlyBehavior {@Overridepublic void fly() {System.out.println("I can't fly!");}
}public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("All ducks float ,even decoys!");}public FlyBehavior getFlyBehavior() {return flyBehavior;}public void setFlyBehavior(FlyBehavior flyBehavior) {this.flyBehavior = flyBehavior;}public QuackBehavior getQuackBehavior() {return quackBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}
}public class MallardDuck extends Duck {public MallardDuck() {flyBehavior=new FlyWithWings();quackBehavior=new Quack();}@Overridepublic void display() {System.out.println("display!");}
}public class ModelDuck extends Duck {public ModelDuck() {flyBehavior=new FlyNoWay();quackBehavior=new Quack();}@Overridepublic void display() {System.out.println("display!");}
}public class MiniDuckSImulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performFly();mallard.performQuack();Duck model=new ModelDuck();model.performFly();model.setFlyBehavior(new FlyRecoketPowered());model.performFly();}
}运行结果:
I'm flying
quack
I can't fly!
I'm flying with a rocket

6. JDK

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

Java设计模式(一):策略设计模式相关推荐

  1. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  2. Java状态和策略设计模式之间的差异

    为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设计原则,从SOLID设计原则 ...

  3. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  4. 工厂设计模式和策略设计模式_设计模式:策略

    工厂设计模式和策略设计模式 这次我想谈谈策略设计模式 . 通过这种方式,我开始撰写有关行为设计模式的文章. 这种模式表示对象之间的某些交互模式,以使代码更灵活且组织得更好.此方法的最本质点是对象之间的 ...

  5. 设计模式:策略设计模式

    一.什么是策略设计模式 1.1 策略设计模式定义 策略设计模式(Strategy Pattern)是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以让算法 ...

  6. Java设计模式之策略设计模式

    1.什么是-策略设计模式 在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Ha ...

  7. 详解:设计模式之-策略设计模式

    分享一波:程序员赚外快-必看的巅峰干货 什么是策略模式 定义一系列的算法,并将每一个算法单独进行封装,而且使它们可以相互替换,从而达到传递不同参数而执行不同算法的结果. 策略模式让算法独立于使用它的客 ...

  8. java策略设计模式_Java中的策略设计模式

    java策略设计模式 策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设 ...

  9. java状态模式和策略模式_Java状态和策略设计模式之间的差异

    java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...

  10. java 设计模式 示例_Java中的策略设计模式-示例教程

    java 设计模式 示例 策略模式是行为设计模式之一 . 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客 ...

最新文章

  1. NYOJ176 整数划分(二)
  2. notification源码分析_Ceilometer之notification agent代码分析
  3. jmeter学习指南之快速玩转16个逻辑控制器
  4. 图说:Windows 8如何关机、重启
  5. Oracle 后台进程详解
  6. cisco881配置连接计算机,Cisco
  7. 【ZYNQ】petalinux包含自定义的动态库
  8. Formality总结
  9. Learning Photoshop Elements 15 Photoshop Elements 15教程 Lynda课程中文字幕
  10. 空间实景三维激光点云数据处理服务来了!
  11. Android 返回键
  12. HTML5+CSS期末大作业:篮球明星个人网站设计——篮球明星介绍(6页) 简单的学生DW网页设计作业成品 web课程设计网页规划与设计 简单个人网页设计作业 静态HTML旅行主题网页作业 DW
  13. 【判断题】【简答题】【数据库原理】
  14. 浏览器首页被劫持(解决)-桔梗网
  15. 博士申请 | 香港城市大学王鲁生教授招收生物信息学方向全奖博士生
  16. ftp客户端软件,什么是ftp客户端软件?对于它,你知道些什么?
  17. 潮汐护符服务器维护后,魔兽世界怀旧服潮汐护符怎么获得-魔兽世界怀旧服潮汐护符获得心得-pvp装备_牛游戏网...
  18. iOS+Android+APP+IAP
  19. HOT 100(一)
  20. 设置Accept-Encoding为gzip,deflate,返回的网页是乱码

热门文章

  1. 570D Codeforces Round #316 (Div. 2) D(dfs序,时间戳,二分
  2. 谷歌旗下Waymo开启数据集虚拟挑战赛
  3. 哪种Python IDE最适合你?这里有一份优缺点列表
  4. 10大机器学习算法速览,带你开启AI之旅
  5. opencv视频模糊处理
  6. int型数字转char型指针
  7. android 代码设置alignleft,如何动态的设置Relative Layout中按钮的layout_align_parent_right属性...
  8. java垃圾回收机制串行_Java垃圾回收机制
  9. python xml解析dom_如何解析python中表示xml.dom.minidom节点的字符串?
  10. axure删除的页面怎么恢复_Axure如何应对意外关闭