
Java常用设计模式之策略模式
发布日期:2021-05-27 02:54:21
浏览次数:4
分类:技术文章
本文共 3496 字,大约阅读时间需要 11 分钟。
在日常写代码过程中,或多或少会遇到设计模式,下面对策略模式是什么及常见使用浅析一下。
策略模式用的最多就是消除 if-else、switch 等多重判断的代码,消除 if-else、switch 多重判断 可以有效应对代码的复杂性,对设计进行解耦。
如果分支判断会不断变化(增、删、改),可以在使用策略模式时满足 开闭原则(简单理解为不修改,可新增) ,就可以提高代码的扩展性。
下面为一段场景代码示例,针对该代码示例后面会应用策略模式进行重构。
public class Example { public static void main(String[] args) { Double discount = discount("1",10D); System.out.println(discount); } private static Double discount(String type , double price) { if (Objects.equals(type,"1")) { return price * 0.95; } else if (Objects.equals(type,"2")) { return price * 0.9; } else if (Objects.equals(type,"3")) { return price * 0.85; } else { return price; } }}
这段代码可以实现不同的优惠,但是若优惠的类别很多很复杂,那么这段代码的复杂性可想而知;还有可能优惠会变化,那么这段代码需要反复修改,那么会对代码功能造成巨大隐患及工作量。
应用策略模式进行重构需要如下三个步骤:
- 抽象策略接口:业务使用接口而不是具体的实现类,所以可以灵活的替换不同的策略
- 策略实现类:实现抽象策略接口,其内部封装具体的业务实现
- 策略工厂:封装创建策略实现(算法),对客户端(使用)屏蔽具体的创建细节
代码如下:
public interface DiscountStrategy { Double discount(Double price);}public class Discount95Strategy implements DiscountStrategy { @Override public Double discount(Double price) { return price * 0.95; }}public class Discount9Strategy implements DiscountStrategy { @Override public Double discount(Double price) { return price * 0.9; }}public class DiscountStrategyFactory { // 策略存储容器 private static final MapdiscountStrategies = new HashMap<>(); static { discountStrategies.put("1", new Discount95Strategy()); discountStrategies.put("2", new Discount9Strategy()); } public static DiscountStrategy chooseStrategy(String type) { return discountStrategies.get(type); }}public class Example2 { public static void main(String[] args) { // 从抽象策略工厂中选择具体的策略 DiscountStrategy discountStrategy = DiscountStrategyFactory.chooseStrategy("1"); // 执行具体策略 Double discount = discountStrategy.discount(10D); // 输出策略执行结果 System.out.println("优惠后金额:" + discount); }}
结果如下:
优惠后金额:9.5
应用策略模式后的代码消除了if - else判断,降低了代码复杂度,但是若新增一个优惠策略,那么需要新增一个策略实现类,并且需要改动策略工厂,下面修改使之适应开闭原则(可扩展)。
将策略模式应用到spring中,在策略实现类、策略工厂中新增@Component注解,并修改策略工厂
public interface DiscountStrategy2 { Double discount(Double price);}@Componentpublic class Discount95Strategy2 implements DiscountStrategy2 { @Override public Double discount(Double price) { return price * 0.95; }}@Componentpublic class Discount9Strategy2 implements DiscountStrategy2 { @Override public Double discount(Double price) { return price * 0.9; }}public class DiscountStrategyFactory2 { private DiscountStrategy2 discountStrategy2; public DiscountStrategyFactory2(DiscountStrategy2 discountStrategy2) { this.discountStrategy2 = discountStrategy2; } public DiscountStrategy2 getDiscountStrategy2() { return discountStrategy2; } public void setDiscountStrategy2(DiscountStrategy2 discountStrategy2) { this.discountStrategy2 = discountStrategy2; }}// 单元测试@Test public void test2() { DiscountStrategyFactory2 discountStrategyFactory2 = new DiscountStrategyFactory2(discount95Strategy2); DiscountStrategy2 discountStrategy2 = discountStrategyFactory2.getDiscountStrategy2(); // 执行具体策略 Double discount = discountStrategy2.discount(10D); // 输出策略执行结果 System.out.println("优惠后金额:" + discount); }
结果同上。通过策略模式减少代码的复杂性,继而通过 Spring 的一些特性同时满足了开闭原则,现在来了新需求只要添加新的策略类即可,健壮易扩展。
小结:策略模式核心为抽象策略接口、策略实现类、策略工厂。
转载地址:https://blog.csdn.net/leijie0322/article/details/113825772 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2023年11月07日 12时44分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JAVA操作HDFS的文件系统
2019-03-25
HDFS的简单分布式集群集群搭建
2019-03-25
Yarn简单分布式集群搭建
2019-03-25
第一个MapReduce程序开发
2019-03-25
MapReduce程序自动化执行
2019-03-25
配置MapReduce的历史服务器查看MR运行日志
2019-03-25
对程序员来说CPU是什么?
2019-03-25
ANSYS APDL入门教程
2019-03-25
详解计算机内部存储数据的形式---二进制数
2019-03-25
C# 调用Ansys APDL编写的命令(带参和不带参宏文件调用)
2019-03-25
浮点数(小数)在计算机中如何用二进制存储?
2019-03-25
详解计算机内存及基于内存理解的几种数据结构
2019-03-25
计算机内存和磁盘的关系
2019-03-25
谈谈数据压缩的机制
2019-03-25
Python极速上手教程
2019-03-25
经典数据结构深入理解(大道至简)(一)
2019-03-25
CUDA编程入门教程
2019-03-25
CentOS7 安装配置CUDA教程
2019-03-25
Linux常用操作命令
2019-03-25
Linux代码编辑器之vim常用操作详解
2019-03-25