JAVA架构师之路十五:设计模式之策略模式

article/2025/9/29 11:09:08

JAVA架构师之路十四:设计模式之模板模式

策略模式

    • 1. 策略模式
    • 2. 优惠券案例
    • 3. 支付案例

人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。

1. 策略模式

定义

策略模式又叫政策模式,它是将定义的算法家族,分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。

可以避免多重分支的if 。。。。else 和switch语句。

属于行为型模式

适用场景

假如系统中有很多的类,而他们的区别仅仅在于他们的行为不同。

一个系统需要动态地在几种算法中选择一种

需要屏蔽算法规则

优点

策略模式符合开闭原则

避免使用多出个的条件转移语句,如if … else 、switch语句

使用策略模式可以提高算法的保密性和安全性。

缺点

客户端必须要知道所有的策略,并且自己决定执行使用哪一个策略类

代码中会产生非常多的策略类,增加维护难度

2. 优惠券案例

网购中有很多优惠策略,那么这种场景非常适合策略模式

public interface IPromotionStrategy {void doPromotion();
}
public class CashbackStrategy implements IPromotionStrategy {public void doPromotion() {System.out.println("返现,直接打款到支付宝账号");}
}
public class CouponStrategy implements IPromotionStrategy {public void doPromotion() {System.out.println("使用优惠券抵扣");}
}
public class EmptyStrategy implements IPromotionStrategy {public void doPromotion() {System.out.println("无优惠");}
}
public class GroupBuyStrategy implements IPromotionStrategy {public void doPromotion() {System.out.println("5人团购, 可以优惠");}
}
public class PromotionFactory {private static Map<String, IPromotionStrategy> PROMIOTIONS = new HashMap<String, IPromotionStrategy>();private static final IPromotionStrategy EMPTY = new EmptyStrategy();static {PROMIOTIONS.put(PromotionKey.CASHBACK, new CashbackStrategy());PROMIOTIONS.put(PromotionKey.COUPON, new CouponStrategy());PROMIOTIONS.put(PromotionKey.GROUPBUY, new GroupBuyStrategy());}public static IPromotionStrategy getPromiotion(String promotion) {if (PROMIOTIONS.containsKey(promotion)) {return PROMIOTIONS.get(promotion);}return EMPTY;}private interface PromotionKey {String COUPON = "COUPON";String CASHBACK = "CASHBACK";String GROUPBUY = "GROUPBUY";}public static Set<String> getPromotionKeys(){return PROMIOTIONS.keySet();}
}
public class Test {public static void main(String[] args) {Set<String> promotions = PromotionFactory.getPromotionKeys();System.out.println("所有支付方式:" + promotions.toString());String promotion = "COUPON";IPromotionStrategy strategy = PromotionFactory.getPromiotion(promotion);strategy.doPromotion();promotion = "CASHBACK";strategy = PromotionFactory.getPromiotion(promotion);strategy.doPromotion();}
}
所有支付方式:[CASHBACK, COUPON, GROUPBUY]
使用优惠券抵扣
返现,直接打款到支付宝账号

在这里插入图片描述

3. 支付案例

最典型的策略模式就是支付。现在网购支付方式多种多样,不同的支付方式都有不同背后算法。

public class MsgResult {private int code;private String msg;private Object data;public MsgResult(int code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}@Overridepublic String toString() {return "MsgResult{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
public abstract class Payment {public MsgResult pay(String uid, double amount) {if (queryBlance(uid) < amount) {return new MsgResult(500, "支付失败", "余额不足");}return new MsgResult(0, "支付成功", "支付金额: " + amount);}protected abstract double queryBlance(String uid);protected abstract String getName();
}
public class AliPay extends Payment {@Overridepublic double queryBlance(String uid) {return 1000;}@Overridepublic String getName() {return "支付宝";}
}
public class JDPay extends Payment {@Overridepublic double queryBlance(String uid) {return 900;}@Overridepublic String getName() {return "京东支付";}
}
public class YunShanPay extends Payment {@Overridepublic double queryBlance(String uid) {return 500;}@Overridepublic String getName() {return "云闪付";}
}
public class PayStrategy {public static final String ALI_PAY = "ALI_PAY";public static final String JD_PAY = "JD_PAY";public static final String YUNSHAN_PAY = "YUNSHAN_PAY";public static final String DEFAULT_PAY = ALI_PAY;private static Map<String, Payment> strategy = new HashMap<String, Payment>();static {strategy.put(ALI_PAY, new AliPay());strategy.put(JD_PAY, new JDPay());strategy.put(YUNSHAN_PAY, new YunShanPay());}public static Payment getPayment(String payKey) {if (strategy.containsKey(payKey)) {return strategy.get(payKey);}return strategy.get(DEFAULT_PAY);}
}
public class Order {private String uid;private String orderId;private double amount;public Order(String uid, String orderId, double amount) {this.uid = uid;this.orderId = orderId;this.amount = amount;}public MsgResult pay() {return pay(PayStrategy.DEFAULT_PAY);}public MsgResult pay(String payKey) {Payment payment = PayStrategy.getPayment(payKey);System.out.println("欢迎使用: " + payment.getName() + "支付");System.out.println("本次交意金额: " + amount + "开始支付");return payment.pay(uid, amount);}
}
public class Test {public static void main(String[] args) {Order order = new Order("1", "202012160909", 999);System.out.println(order.pay());System.out.println(order.pay(PayStrategy.JD_PAY));System.out.println(order.pay(PayStrategy.YUNSHAN_PAY));}
}
欢迎使用: 支付宝支付
本次交意金额: 999.0开始支付
MsgResult{code=0, msg='支付成功', data=支付金额: 999.0}
欢迎使用: 京东支付支付
本次交意金额: 999.0开始支付
MsgResult{code=500, msg='支付失败', data=余额不足}
欢迎使用: 云闪付支付
本次交意金额: 999.0开始支付
MsgResult{code=500, msg='支付失败', data=余额不足}

在这里插入图片描述

感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。

JAVA架构师之路十六:设计模式之责任链模式


http://chatgpt.dhexx.cn/article/5dkckVS9.shtml

相关文章

走向Java架构师之路:成为架构师要掌握的8大能力

架构师是什么?是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。 如何才能达到Java架构师技术要求标准?Java架构师需要熟练…

JAVA架构师之路十一:设计模式之适配器模式

JAVA架构师之路十&#xff1a;设计模式之组合模式 适配器模式 1. 适配器模式2. 类适配器写法3. 对象适配器写法4. 接口适配器写法 钟表&#xff0c;可以回到起点&#xff0c;但已不是昨天。 生活中处处可见适配现象&#xff1a;手机充电器的充电头&#xff0c;电脑电源适配器&…

Java架构师:概述

一、Java架构师核心技术栈 二、架构师需要具备的其他能力 三、技术选型 四、早期传统JavaWeb开发模式 五、前后端分离开发模式 六、Maven聚合项目 七、数据库设计工具PDMan 八、数据库外键弊端【移除物理外键&#xff0c;而非逻辑外键】 数据库表与表之间字段间不要有物理外键…

Java架构师之路:微服务架构图解和详情

微服务框架搭建&#xff1a; 总体规划框架名称当前技术选型方案微服务框架搭建 开发框架 单体服务SpringBoot 分布式框架SpringCloud 最新框架SpringCloudAlibaba 服务配置中心 服务消息总线 阿里巴巴Nacos、 ConfigBusRabbitMQ配合使用、 携程apolo 服务网关 Spr…

java架构师进阶之路

要想进阶为架构师&#xff0c;不仅要有知识广度&#xff0c;还要有深度。 最近把今天收集的java学习资料整理了下&#xff0c;里面包含了计算机基础、算法和数据结构、常用工具、java核心知识、性能优化、基础框架、数据库、消息队列、缓存中间件、搜索引擎、大数据、RPC、网关…

通往Java架构师之路

Java架构师&#xff0c;应该算是一些Java程序员们的一个职业目标了吧,很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢&#xff0c;总体来说呢&#xff0c;有两方面&#xff0c;一个是基础技术&#xff0c;另一个就是组织能力和提出解决方案能力。…

如何成为Java架构师?学习路线是怎样的?大佬总结成长之路跟着往上走,建议你提早开始准备!

导读 好程序员告诉你Java架构师学习路线&#xff0c;从初级Java工程师成长为Java架构师&#xff0c;你需要走很长的路&#xff0c;很多有计划的人在学习之初就在做准备。你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓…

从三方面分析,Java程序员如何晋升为高薪Java架构师?

对于工作多年的程序员而言,日后的职业发展无非是继续专精技术、转型管理和晋升架构师三种选择。下面,我从架构师在一家公司有多重要、优秀架构师需要具备怎样的素质以及架构师的发展现状三个方面来分析,Java程序员如何才能晋升为优秀的高薪Java架构师? 希望通过本文我的分…

getByte()用法小结

在Java中&#xff0c;String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下&#xff0c;返回的东西不一样&#xff01; String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示&#xff0c;如&a…

java中String的getByte()方法

Java getBytes() 方法 Java String类 getBytes() 方法有两种形式&#xff1a; getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列&#xff0c;并将结果存储到一个新的 byte 数组中。getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列&#…

JAVA中的getBytes方法

在Java中&#xff0c;String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下&#xff0c;返回的东西不一样&#xff01; String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示&#xff0c;如&a…

JAVA中的getBytes()方法

在Java中&#xff0c;String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下&#xff0c;返回的东西不一样&#xff01; String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示&#xff0c;如&a…

Java数组作业题

计算一维数组中最大值和最小值的数据之和; package org.oracle.test;public class Arr01 {public static void main(String[] args) {int[] arr { 6, 3, 2, 7, 9, 1, 5, 4, 4, 4, 10, 9 };int max arr[0];int min arr[0];for (int i 1; i < arr.length; i) {if (max &l…

Oracle、hive、Hbase基本操作

文章目录 Oracle基本操作概述库相关备份库还原库 表相关数据相关 hive基本操作库相关表相关表操作 Hbase基本操作概述操作 Oracle基本操作 概述 Oracle 一般创建一个全局库&#xff0c;可以但不建议创建多个库Oracle 一个用户是一个库&#xff0c;创建不同的库就要创建不同的…

数据库:Oracle和MySQL

关系型数据库 概念 关系数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。简单说&#xff0c;关系型数据库是由多张能互相联接的二维行…

Oracle SQL学习笔记

参考&#xff1a;FreeIT-Oracle教程 实用sql 0.1、update内容中含有单引号 方案&#xff1a;用两个单引号代替一个单引号 select to_char(aa否aa) from dual;--aa否aa 0.2、找表 -- 找表 select a.OWNER 表所属用户,a.TABLE_NAME 表明,a.* from all_tables a where a.TABL…

oracle取第二大的值,【Oracle】oracle取最大值和最小值的几个方法汇总

(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man, max(sal) keep(dense_rank F…

数组与集合

数组与集合 数组 数组是一组具有相同类型的有序数据的集合。数组中的一个数据成员称为数组元素。数组生成后&#xff0c;数组长度不可改变。 字符串数组&#xff1a;字符串数组在初始化时创建 对象数组&#xff1a;可以将不同数据类型的元素封装成对象数组 Object a[] new Ob…

复习笔记第六章 - JAVA中的数组

文章目录 一、数组的创建及初始化1. 数组创建格式2. 数组的初始化3. 数组元素的默认值 二、数组的使用1. 使用下标访问数组元素2. 遍历数组 三、数组是引用类型1. 初始JVM内存分布**区域划分** 2. 基本类型变量和引用类型变量的区别2.1 基本数据类型作为函数参数2.2 引用数据类…

java 删除组中的0元素,Java中如何优雅地删除List中的元素

在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式。 前提知识准备 for循环的执行顺序 这里借用百度百科的一张图,简明扼要的介绍…