欢迎关注我新搭建的博客:http://www.itcodai.com/

  策略模式在实际中使用的还是挺多的,先来看一个场景:某个市场人员接到单儿后的报价策略,保价策略很复杂,但是可以简单做如下归类:

新客户小批量报价
新客户大批量报价
老客户小批量报价
老客户大批量报价

  具体选用哪个报价策略,这需要根据实际情况来确定,这时候采用策略模式即可解决这个问题。这个问题中,如果我们不采用策略模式会怎样处理呢?很自然的会想到使用if判断,或者switch…case…来解决,根据不同的用户确定不同的报价。类似于如下的结构:

public double getPrice(String type, double price) {if(type.equals("新客户小批量")) {// 处理报价逻辑return price;} else if(type.equals("新客户大批量")) {// 处理报价逻辑return price;} //......
}

  或者使用switch….case….,但是很明显有个弊端,这个类型特别多,而且每个类型里面还有自己的算法,如果算法比较复杂的话整个条件的控制代码会变得很长,难以维护。为了解决这个问题,我们可以使用策略模式。
  策略模式:即对应于解决某一个问题的一个算法族,允许用户从该算法族中人选个一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且由客户端决定调用哪个算法,可以如下的示意图:

  首先有个策略的接口,然后不同的四个不同的策略分别实现这个接口中的方法,在这里是报价的方法,然后定义一个上下文类,用来操作具体的具体的策略,客户端只需要与这个上下文打交道即可,即只要将策略传给上下文类,就可以执行相应的策略,后期如果需要修改或者添加,只需要修改具体的策略实现类或者新添加一个实现类即可,便于维护。下面来看下程序的实现。

//策略接口
public interface Strategy {public double getPrice(double standardPrice);}

四个不同的策略实现类:

// 新客户小批量
public class NewCustomerFewStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("新客户小批量,不打折");return standardPrice;}}// 新客户大批量
public class NewCustomerManyStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("新客户大批量,打九折");return standardPrice * 0.9;}}// 老客户小批量
public class OldCustomerFewStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("老客户小批量,打八折");return standardPrice * 0.8;}}// 老客户大批量
public class OldCustomerManyStrategy implements Strategy {@Overridepublic double getPrice(double standardPrice) {System.out.println("老客户大批量,打八折");return standardPrice * 0.7;}}

然后就是上下文类了:

/*** @Description 负责和具体的策略交互,具体的算法和直接的客户端分离。* @author Ni Shengwu**/
public class Context {private Strategy strategy;// 通过构造方法注入具体的策略,如果用Spring,就可以直接使用@Resource来注入了public Context(Strategy strategy) {super();this.strategy = strategy;}public void getPrice(double standardPrice) {System.out.println("报价为:" + strategy.getPrice(standardPrice));}}

测试一下:

public class Client {public static void main(String[] args) {Strategy s1 = new OldCustomerManyStrategy();Context ctx = new Context(s1); //通过构造方法注入策略ctx.getPrice(1000);}}

输出结果为:

老客户大批量,打八折
报价为:700.0

在实际中,策略模式在spring中也有用到,通过注解@Resource就是使用该模式,注入哪个就使用哪个。
  
【友情提示】我的 Spring Boot 达人课上线了,您的支持是我创作的最大动力!

扫码试读或 点此试读
文末福利:“程序员私房菜”,一个有温度的公众号~


—–乐于分享,共同进步!
—–我的博客主页:http://blog.csdn.net/eson_15

【java设计模式】之 策略(strategy)模式相关推荐

  1. C++设计模式实现--策略(Strategy)模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/30489331 一. 举例说明 曾经做了一个程序,程序 ...

  2. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  3. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

  4. Java设计模式之策略模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. Java设计模式系列3-----装饰模式,策略模式,观察者模式

    1.装饰模式 装饰(Decorator)模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. package com.ibeifeng.news;public i ...

  6. java语言商场打折_Java封装商场打折策略(Strategy模式)

    有了OO的基础后,开始认真学习设计模式. 首先学习的是Strategy,下面就封装商场打折策略来分析下策略模式是怎样一回事. 商场每逢节假日都会对不同的商品采用不同的打折策略,首先卖苹果的说我的苹果要 ...

  7. Java设计模式之策略模式+工厂模式+模板模式

    Java设计模式之策略模式+工厂模式+模板模式 1.策略模式+工厂模式+模板模式 个人的理解:实际开发工程中,一些业务很复杂的逻辑使用很多的 if 或者 if···else 语句,不利于维护和扩展,为 ...

  8. java if打折怎么算_Java封装商场打折策略(Strategy模式)

    有了OO的基础后,开始认真学习设计模式. 首先学习的是Strategy,下面就封装商场打折策略来分析下策略模式是怎样一回事. 商场每逢节假日都会对不同的商品采用不同的打折策略,首先卖苹果的说我的苹果要 ...

  9. 策略(strategy)模式

    Head First一书中对于策略(strategy)模式的正式定义是:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户. 为了介绍这个算法,书中讲了 ...

  10. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

最新文章

  1. 骆利群院士最新Science综述:神经环路架构,激发新的AI
  2. .NET Framework、C#语言、IDE、CLR 版本历史及其差异(最新)
  3. LINQ TO LISTT 合并列表
  4. Task 10 统计从1到某个整数之间出现的1的次数
  5. 《openssl 编程》之 DH
  6. SharePoint服务器连接配置数据库的连接字符串保存位置
  7. 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory...
  8. 欢乐大作战服务器维护,欢乐大作战
  9. 塞尔达传说gba_【译介】《塞尔达传说:不可思议的帽子》2004年开发者访谈
  10. 如何修改macOS文件的默认打开方式?
  11. IPv6Tools:IPv6安全审计框架
  12. Linux笔记6_vim编辑器常用命令总结
  13. 黑苹果怎么进recovery_黑苹果怎么自定义Clover GUI启动选项 黑苹果修复Clover GUI启动选项教程...
  14. IP 地址、网络号和主机号、ABC三类、ip地址可分配问题、子网掩码、子网划分
  15. Dota2 荒神罪 破解
  16. 节奏旋律音乐制作软件-Native Instruments Maschine 2 v2.14.1 WiN
  17. 数据分析之 假设检验
  18. 【服务器数据恢复】服务器误删除ESXi虚拟机的数据恢复案例
  19. C++中rand函数和srand函数
  20. Android Studio制作简易微信界面

热门文章

  1. java ffmpeg 合并视频_android ffmpeg视频剪切与合并
  2. 【华为WLAN】WLAN网络,AC旁挂直接转发基本配置。
  3. Linux大师(古鲁)话说USB发行版
  4. [FS 社区资料]40GBASE-LR4 QSFP+光模块适用的两种链路:CWDM和PSM
  5. 51单片机控制SG90 9g舵机
  6. 超图发布SuperMap GIS 8C(2017) 进一步挖掘空间大数据价值
  7. 基于MSP430G2553官方开发板的音乐播放器
  8. 【Microsoft Office】卸载 Office 365 捆绑软件 Publisher/OneDrive/Outlook/Access
  9. ASCII表字符对照表【大致分为3种】
  10. Thinkphp数据库中文拼音order排序