策略模式

定义:
策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装 到一系列的策略类里面,作为一个抽象策略类的子类。
简单来说就是就定义一个策略接口,子类策略去实现该接口去定义不同的策略。然后定义一个环境(Context,也就
是需要用到策略的对象)类,以策略接口作为成员变量,根据环境来使用具体的策略。
优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。

策略模式案例

案例:结算价格计算,根据Vip不同等级进行运算

不同VIP优惠价格分析


用户在购买商品的时候,很多时候会根据Vip等级打不同折扣,尤其是在线商城中体现的淋漓尽致。我们这里也基于 真实电商案例来实现VIP等级价格制:
Vip0->普通价格 Vip1->减5元 Vip2->7折 Vip3->5折

代码实现

定义策略接口: Strategy

public interface Strategy { //价格计算 Integer payMoney(Integer payMoney);
}

定义Vip0策略: StrategyVipOne

@Component(value = "strategyVipOne")
public class StrategyVipOne implements Strategy { //普通会员,没有优惠 @Override public Integer payMoney(Integer payMoney) { return payMoney; }
}

定义Vip1策略: StrategyVipTwo

@Component(value = "strategyVipTwo")
public class StrategyVipTwo implements  Strategy{ //策略2 @Override public Integer payMoney(Integer payMoney) { return payMoney-5; }
}

定义Vip2策略: StrategyVipThree

@Component(value = "strategyVipThree")
public class StrategyVipThree implements  Strategy{ //策略3 @Override public Integer payMoney(Integer payMoney) { return (int)(payMoney*0.7); }
}

定义Vip3策略: StrategyVipFour

@Component(value = "strategyVipFour")
public class StrategyVipFour implements  Strategy{ //策略4 @Override public Integer payMoney(Integer payMoney) { return (int)(payMoney*0.5); }
}

定义策略工厂: StrategyFactory

@Component
@ConfigurationProperties(prefix = "strategy")
public class StrategyFactory implements ApplicationContextAware {//①注入ApplicationContext//vipOne:VipOneInstance//vipTwo:VipTwoInstance//vipThree:VipThreeInstance//vipFour:VipFourInstanceprivate ApplicationContext act;//1:vipOne//2:vipTwo//3:vipThree//4:vipFourprivate Map<Integer,String> strategyMap;/**** 通过等级获取用户对应的策略实例*/public VipMoney get(Integer level){//获取等级对应的策略实例IDString id = strategyMap.get(level);//根据策略实例ID从容器中获取策略实例return act.getBean(id,VipMoney.class);}//注入配置中的映射信息public void setStrategyMap(Map<Integer, String> strategyMap) {this.strategyMap = strategyMap;}//注入容器@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {act = applicationContext;}

等级策略配置:修改application.yml,将如下策略配置进去

#策略配置
strategy: strategyMap: 1: strategyVipOne 2: strategyVipTwo 3: strategyVipThree 4: strategyVipFour

等级控制:修改 UserHandler添加等级属性

修改 UserHandlerShare定义等级,代码如下:

装饰者模式中修改 VipMoneySum的价格运算,代码如下:

深入浅出设计模式---7、策略模式相关推荐

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

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

  2. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  5. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

  6. python策略模式包含角色_详解Python设计模式之策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中"不见了,或者简 ...

  7. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  8. 面向对象设计模式之策略模式

    面向对象设计模式之策略模式 1.策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 2.抽象鸭子类,鸭子飞行行为在此处类似于算法族 1 package ...

  9. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  10. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. python的主要应用领域及常用的函数模块_python之常用模块篇5
  2. PHP中文无法查询,php 中htmlentities导致中文无法查询问题
  3. python2编码_Python2字符编码
  4. 多机器人路径规划的代码_知荐 | 地平线机器人算法工程师总结六大路径规划算法...
  5. git上传到github
  6. 非线性优化库Ceres问题记录
  7. LeetCode之第一个错误版本
  8. 《软件需求十步走》阅读笔记6
  9. 寻找可接入正版音乐曲库的音乐API?来了解HIFIVE音乐开放平台!
  10. 百度地图点聚合,加载1万个marker
  11. Openwrt源码LuCI应用完整说明
  12. faster RCNN之RPN详解
  13. 黄永成think php rest,Rest控制器
  14. 禁用win10触摸屏手势_禁用和启用Win10平板边缘滑动手势的详细方法
  15. 【智能安防监控补光灯调光芯片方案】单节锂电降压恒流驱动芯片FP8013 最大输出3A体积小/静态功耗低/效率高/支持无频闪调光
  16. plist文件详细说明
  17. zabbix4.0 zabbix-server.service never wrote its PID file. Failing.
  18. ECharts 绘制地图飞线
  19. 四象限法推导lm曲线_SEM数据分析四象限方法
  20. 品牌的成功取决于质量的好坏

热门文章

  1. Perl语言入门(第六版)pdf
  2. java简单入门教程_史上最快速最简单的java入门教程
  3. 开发板与虚拟机tftp服务器安装与使用
  4. vb ftp linux,一个功能比较完整VB FTP程序+源码
  5. 牛腩新闻发布系统-发布
  6. Android中图片去色的两种方法
  7. 2022年ADB 命令知多少?一文2000字详细 ADB 命令大全来啦
  8. 中国游戏发展史V-02
  9. 数字信号处理实验集合
  10. DELMIA软件物流仿真:机器人输送带上下料虚拟仿真操作方法