策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

通俗点,策略模式就是打折模式


策略模式的结构

  策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理(各算法自成一类(具体策略(ConcreteStrategy)角色),实现抽象算法接口(抽象策略(Strategy)角色),再提供一个构造器(环境(Context)角色),供外部调用)。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

  这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。(多态)

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

认识策略模式

  策略模式的重心

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

  算法的平等性

  策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。

  所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

  运行时策略的唯一性

  运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

  公有的行为

  经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面(比如算法都是要先降9折的情况下,再各自减去他们的算法。那么可以打9折在Strategy抽象类实现)。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。

  这其实也是典型的将代码向继承等级结构的上方集中的标准做法。

策略模式的优点

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

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

策略模式的缺点

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

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

实现代码如下:

package design.strategy;

public interface Strategy {
    double getPrice(double price);
}
package design.strategy;

public class OldUser implements Strategy {

@Override
    public double getPrice(double price) {
        System.out.println("老用户打8折");
//        System.out.println(price * 0.8 + "元");
        return price*0.8;
    }
}
package design.strategy;

public class NewUser implements Strategy {

@Override
    public double getPrice(double price) {
        System.out.println("新用户不打折");
//        System.out.println(price + "元");
        return price;
    }
}
package design.strategy;

public class Context {
    private Strategy strategy;

public Context() {
    }

public Context(Strategy strategy) {
        this.strategy = strategy;
    }

public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

public void getPrice(double price) {
        System.out.println(strategy.getPrice(price));
    }
}
package design.strategy;

import javax.print.DocFlavor;

public class text {

public static void main(String[] args) {

//        Strategy strategy = new OldUser();
        Context context = new Context( );
        context.setStrategy(new OldUser());

//        Context context = new Context(strategy);
        context.getPrice(100);
    }

}

行为型模式:策略模式相关推荐

  1. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

  2. JavaScript 设计模式核⼼原理与应⽤实践 之 行为型:策略模式——重构小能手,拆分“胖逻辑”

    JavaScript 设计模式核⼼原理与应⽤实践 之 行为型:策略模式--重构小能手,拆分"胖逻辑" 行为型:策略模式--重构小能手,拆分"胖逻辑" 策略模式和 ...

  3. 设计模式 — 行为型模式 — 策略模式

    目录 文章目录 目录 策略模式 应用场景 代码示例 策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换.这意味着,让一个类的行为(算法)可以 ...

  4. 【设计模式系列】行为型之策略模式

    定义 首先介绍一下众多博客文章中提到的策略模式的概念,针对于文章结构构成,请允许小编在此处再细说一下. 策略模式:百度百科中引述为:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法. 1. ...

  5. java-抽象工厂模式+工厂方法模式+策略模式简单应用实战(登录场景)

    前言 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式 ...

  6. 工厂模式+策略模式+反射机制解决系统功能模块相似的问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景 痛点 一.如何根据不同条件获取不同的数据库Mapper? 二.如何根据不同条件创建相应的数据库实体对象? 总结 背景 ...

  7. 进阶学习之旅-设计模式之(委派模式策略模式)

    文章目录 1.课程学习目标 2.内容定位 3.委派模式详解 3.1委派模式的定义 3.2 demo案例 3.2.1模拟Boss指派任务给Leader 由员工完成任务执行 3.2.2 模拟spring ...

  8. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  9. 23种模式——策略模式

    目录 策略模式 策略模式的收银软件 策略模式的特点 使用场景 优缺点 策略模式和工厂模式的结合 策略(Strategy)模式 本质:分离算法,选择实现. 策略模式:针对一组算法,将每一个算法封装到具有 ...

  10. 模板模式+策略模式优化

    前言 写在最前面,最近在项目中发现一部分代码,可以用模板模式+策略模式来进行优化. 背景 业务中,系统中对订单状态的处理,需要发送对用户短信发送或者微信推送等操作. 发送短信和微信推送钱,需要处理逻辑 ...

最新文章

  1. 原生js清空上一个元素内容_原生JS实现动态添加新元素、删除元素方法
  2. 让我们来开发一种更类似人脑的神经网络吧(三)
  3. C#-常用对象-思维导图
  4. html的页面宽高变形问题,CSS+div 设计的网页在不同浏览器中变形的问题
  5. python xlutils函数,python3:xlrd、xlwt、xlutils处理excel文件
  6. mysql数据库txt备份linux_linux备份mysql数据库
  7. tecplot批量导出图片_批量导出Excel图片,用这招,半分钟干的活别人一整天完不成...
  8. 4chan 爬虫_类似4chan网站
  9. Spring容器创建流程——总结
  10. pygame游戏_Pygame游戏——Pong游戏(三)
  11. stderr 用法 linux,linux – 如何在使用“tee”时使用管道将stderr写入文件?
  12. 计算机组成原理-计算机硬件的基本组成
  13. html小票表格制作,菜单小票模板word
  14. 一图看懂ADSL拨号服务器
  15. linux下.txt文件名乱码,Linux下打开txt文件乱码问题解决方案
  16. 当Android开发遇到魅族手机
  17. 【第2期免费送书】 10本机器学习与Python相关书籍等你来领!经典之作,绝对领你心动......
  18. linux 下如何添加用户、权限
  19. Error in nextTick: TypeError: Cannot read property 'children' of undefined 解决
  20. 浅谈主键索引与唯一索引

热门文章

  1. [javaEE] 三层架构案例-用户模块(二)
  2. Spark On YARN 集群安装部署
  3. Android开发 asmack断线收不到通知的BUG解决
  4. Java中log4j控制写入日志开关
  5. Mongodb学习(安装篇): 在centos下的安装
  6. 新版本找不到tf.contrib的解决方案
  7. matlab 字符串替换
  8. 网络编程五种IO模型之poll模型
  9. 基于Android Studio的内存泄漏检测与解决全攻略
  10. 基于机器学习的捡球机器人设计与实现(探索)第3篇——opencv基础知识学习(2019-02-02)