Java描述设计模式(22):策略模式
本文源码:GitHub·点这里 || GitEE·点这里
一、生活场景
每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。
public class C01_InScene { public static void main(String[] args) { // 选择满减策略,走相应的计算方式 FullReduce strategy = new Full100 (); Payment price = new Payment(strategy); double quote = price.payment(300); System.out.println("最终价格为:" + quote); } } /** * 付款 */ class Payment { private FullReduce fullReduce ; public Payment (FullReduce fullReduce){ this.fullReduce = fullReduce ; } public double payment (double totalPrice){ return this.fullReduce.getPayMoney(totalPrice) ; } } /** * 金额满减接口 */ interface FullReduce { double getPayMoney (double totalPrice) ; } /** * 不同的满减策略 */ class Full100 implements FullReduce { @Override public double getPayMoney(double totalPrice) { if (totalPrice >= 100){ totalPrice = totalPrice-20.0 ; } return totalPrice ; } } class Full500 implements FullReduce { @Override public double getPayMoney(double totalPrice) { if (totalPrice >= 500){ totalPrice = totalPrice-120.0 ; } return totalPrice ; } }
二、策略模式
1、基础概念
策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客 户端。
2、模式图解
3、核心角色
- 环境角色
持有一个Strategy策略接口角色的引用。
- 抽象策略角色
通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。
- 具体策略角色
包装相关的算法或业务流程。
4、源码实现
public class C02_Strategy { public static void main(String[] args) { Strategy strategy = new ConcreteStrategyB() ; Context context = new Context(strategy) ; context.userMethod(); } } /** 环境角色类 */ class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } public void userMethod (){ this.strategy.strategyMethod(); } } /** 抽象策略类 */ interface Strategy { // 策略方法 void strategyMethod () ; } /** 具体策略类 */ class ConcreteStrategyA implements Strategy { @Override public void strategyMethod() { System.out.println("策略A方法"); } } class ConcreteStrategyB implements Strategy { @Override public void strategyMethod() { System.out.println("策略B方法"); } }
三、策略模式总结
策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放”原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换、易于理解、易于扩展。策略过多是会导致类数目庞大,变得难以维护。
四、源代码地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JS中一定要了解的数据类型和数据转换
一、数据类型 前言 Js中的类型只有6种,其中基本数据类型有5种分别为string,number,boolen,null,undefined,引用类型有一种,就是object,object是一个大的综合体,在JS中除了那5个基本数据类型以外,其他的一切皆对象。以下是最近自学js整理的一些笔记,希望能让更多初学者了解到数据类型的基本概念。 正文 1.获取变量类型 typeof var age = 18; console.log(typeof age); // 'number' 2.基本数据类型 字符串(String),数值型(number),布尔型(boolean) <script> //a.字符串 var a = "laowangba"; //document.write(typeof(a)); //数值 var b = 123; var b1 = 123.1;---> 同样是number类型,不要判断两个浮点数是否相等. //布尔型 var c = ture; var d = false; </script> Boolean字面量: true和false...
- 下一篇
高可用性(High Availability):Redis 哨兵是Redis官方的高可用性解决方案
Redis主从复制的问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。 扩展主节点的读能力,分担主节点读压力。 主从复制同时存在以下几个问题: 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。 主节点的写能力受到单机的限制。 主节点的存储能力受到单机的限制。 原生复制的弊端在早期的版本中也会比较突出,比如:Redis复制中断后,从节点会发起psync。此时如果同步不成功,则会进行全量同步,主库执行全量备份的同时,可能会造成毫秒或秒级的卡顿。 Redis 的 哨兵(Sentinel)深入探究 Redis Sentinel的架构 Redis的哨兵机制就是解决我们以上主从复制存在缺陷(选举问题),保证我们的Redis高可用,实现自动化故障发现与故障转移。 该系统执行以下三个任务: 监控:哨兵会不断检查你的主服务器和从服务器是否运作正常。 提醒:当被监控的某个Redis服务器出现问题时,哨兵可以通过API给程序员发送通知 自动故障转移:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果