一、定义

策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

二、组成

抽象策略角色

定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。

具体策略角色

实现了Strategy定义的接口,提供具体的算法实现。

环境角色

1、需要使用ConcreteStrategy提供的算法。

2、 内部维护一个Strategy的实例。

3、 负责动态设置运行时Strategy具体的实现算法。

4、负责跟Strategy之间的交互和数据传递。

Java策略模式 UML图(百度百科)

三、应用场景

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

四、代码实现

六六三十六,数中有术,术中有数。阴阳燮理,机在其中。机不可设,设则不中。 ——《三十六计》

古之为将帅者,必先深谙兵法三十六计,方能出奇制胜。作为一名程序员,懂得如何在适当的时机采取适当的策略来解决问题也显得尤为重要。

抽象策略类:

package strategy;

/**

* Created by QianWei on 2017/11/16.

* 抽象策略 三十六计

*/

public interface SanShiLiuJi {

void useStrategy();

}

具体策略类:

package strategy;

/**

* Created by QianWei on 2017/11/16.

* 具体策略 连环计

*/

public class LianHuanJi implements SanShiLiuJi {

@Override

public void useStrategy() {

System.out.println("白起使出连环计");

}

}

/**

* Created by QianWei on 2017/11/16.

* 具体策略 金蝉脱壳

*/

public class JinChanTuoQiao implements SanShiLiuJi {

@Override

public void useStrategy() {

System.out.println("白起使出金蝉脱壳");

}

}

/**

* Created by QianWei on 2017/11/16.

* 具体策略 反间计

*/

public class FanJianJi implements SanShiLiuJi {

@Override

public void useStrategy() {

System.out.println("白起使出反间计");

}

}

环境角色类:

package strategy;

/**

* Created by QianWei on 2017/11/16.

* 环境角色 - 战神白起

*/

public class Baiqi {

private SanShiLiuJi sanShiLiuJi;

public Baiqi(SanShiLiuJi sanShiLiuJi) {

this.sanShiLiuJi = sanShiLiuJi;

}

public void setSanShiLiuJi(SanShiLiuJi sanShiLiuJi) {

this.sanShiLiuJi = sanShiLiuJi;

}

public void use(){

sanShiLiuJi.useStrategy();

}

}

测试类:

public class Test {

public static void main(String[] args) {

System.out.println("————大战开始————");

Baiqi baiqi = new Baiqi(new LianHuanJi());

baiqi.use();

System.out.println("————改变作战策略————");

baiqi.setSanShiLiuJi(new FanJianJi());

baiqi.use();

System.out.println("————改变作战策略————");

baiqi.setSanShiLiuJi(new JinChanTuoQiao());

baiqi.use();

System.out.println("————战争结束————");

}

}

运行结果:

————大战开始————

白起使出连环计

————改变作战策略————

白起使出反间计

————改变作战策略————

白起使出金蝉脱壳

————战争结束————

策略模式优缺点分析

优点

1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。

2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

java策略模式使用场景,Java设计模式—策略模式相关推荐

  1. 策略模式应用场景和uml_策略模式

    策略模式应用场景和uml 在最近的博客中,我收到了Wojciech Soczy?ski的评论,内容涉及在使用"不要问"(TDA)时如何使用"战略"模式实施单一责 ...

  2. java 外观模式类图_Java 设计模式——外观模式

    概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...

  3. java命令模式返回值_JAVA 设计模式 命令模式

    目录 用途 命令模式 (Command) 将一个请求 封装为一个对象,从而使你可以用 不同的请求对客户进行 参数化: 对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构 图 ...

  4. java 工厂模式的写法_设计模式-工厂模式

    一.概述 什么是工厂模式? 工厂模式(Factory Pattern)是最常见的一种设计模式之一.它主要是提供一种创建对象的最佳方法! 为什么要学习工厂模式? 与通过new来创建对象不同,使用工厂模式 ...

  5. java门面模式的应用_java设计模式--门面模式

    门面模式 门面模式属于设计模式中的结构型模式,外部与一个子系统通信需要通过一个统一的门面进行,门面模式提供一个高层次的接口,使得子系统易于使用. 门面模式的适用性 门面模式适用于当你要为一个复杂的子系 ...

  6. php 工厂模式 使用场景,PHP设计模式之工厂模式

    序言 每一种模式都有它的定义,它的使用场景.我们从实际当中进行学习并且在相应额场景可以运用.所谓的设计模式只是一种思想,并不存在是有固定的代码.学会了思想并且对应上使用的场景,慢慢而言在开发之中这也就 ...

  7. android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式

    目录 定义 使用场景 UML 模式1 模式2 模式3 简单工厂模式静态工厂模式 简单实现 Android源码中的工厂方法 总结 优点 缺点 工厂方法模式也是创建型模式. 工厂模式根据抽象程度可以分为三 ...

  8. 设计模式 | 策略模式及典型应用

    本文的主要内容: 介绍策略模式 示例 商场购物打折策略的实现 策略模式总结 源码分析策略模式的典型应用 Java Comparator 中的策略模式 Spring Resource 中的策略模式 Sp ...

  9. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  10. 深入理解Java设计模式——状态模式

    目录 一.什么是状态模式 二.状态模式应用场景 三.状态模式实现 1. 需要重构的代码 四.状态模式与策略模式区别 五.状态模式实现 一.什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变 ...

最新文章

  1. 你哪来这么多事(四):职工信息排序
  2. Android建造者模式初探(Toast工具类的进一步封装)
  3. python 的基础 学习 第七天 is id 编码的补充
  4. 编码练习——Java-3-数组
  5. 数据结构杂谈番外篇——搞懂递归的小文章
  6. 2019-2-15 日记
  7. js中的new Option默认选中
  8. Oracle11g密码忘记
  9. 并发编程系列之并发编程的认识
  10. 网站制作笔记-bootstrap可视化布局,表单生成工具,快速制作网页原型
  11. 在linux系统上安装飞秋,linux [Fedora] 下的 飞秋/飞鸽传书
  12. 一个5M免费JSP空间
  13. SYN010型铷原子钟(全国产)
  14. 记工商银行软件开发中心北京研发部面试——人工智能研发岗
  15. 考进中科院计算所:我的经历和体会
  16. PUTT(psftp)文件上传下载
  17. jCO--http://www.cnblogs.com/zfswff/p/5671148.html
  18. 学校党政机关网页面初步设计完成
  19. (转)智能投顾销售基金涉嫌违规,证监会正严查!这两家成典型
  20. GDI+——使用Graphics类绘制基本图形

热门文章

  1. cmd 如何跨驱动器移动文件夹
  2. python ttk style_关于python:在ttk中更改“选项卡标题”的颜色。
  3. win11设置开机自动打开chrome并最大化页面
  4. 全栈工程师是什么,为什么需要全栈工程师?
  5. 利用吉洪若夫正则化及其西尔韦斯特方程来修复受损图像
  6. ORACLE数据库空间满了如何进行空间扩展
  7. 闹闹天宫一直显示服务器错误,闹闹天宫为什么进不去_闹闹天宫进不去解决办法_玩游戏网...
  8. 吉盟珠宝:300家门店异地沟通 效率居然远超“面对面”
  9. 车载以太网 PHY 物理层测试TC8 测试需求
  10. C++变量初始化形式及其默认初始值