当前位置: 首页 > news >正文

java设计模式---策略模式

策略模式的定义

策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。

策略模式的类图:
在这里插入图片描述

策略模式的实现

在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。

  1. 首先,我们需要将支付方式这一行为抽象为一个策略接口,代表支付方式的抽象。
public interface PaymentStrategy {public void payment(BigDecimal amount);}
  1. 然后我们再针对需要支持的三种支付方式建立对应的策略实现类。

银行卡支付策略

public class CreditPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用银行卡支付" + amount);// 去调用网联接口}
}

微信支付策略

public class WechatPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用微信支付" + amount);// 调用微信支付API}
}

支付宝支付策略

public class AlipayPaymentStrategy implements PaymentStrategy {@Overridepublic void payment(BigDecimal amount) {System.out.println("使用支付宝支付" + amount);// 调用支付宝支付API}
}
  1. 然后重新实现我们的支付服务PaymentService。
public class PaymentService {/*** 将strategy作为参数传递给支付服务*/public void payment(PaymentStrategy strategy, BigDecimal amount) {strategy.payment(amount);}
}

我们将支付策略作为参数传递给支付服务,在支付服务中只需要按照运行时传的支付策略对象进行支付就可以了。

我们来测试一下使用策略模式之后的代码。

public class StrategyTest {public static void main(String[] args) {PaymentService paymentService = new PaymentService();// 使用微信支付paymentService.payment(new WechatPaymentStrategy(), new BigDecimal("100"));//使用支付宝支付paymentService.payment(new AlipayPaymentStrategy(), new BigDecimal("100"));}
}

运行结果:

在使用了策略模式之后,在我们的支付服务PaymentService中便不需要写复杂的if…else,如果需要新增加一种支付方式,只需要新增一个新的支付策略实现,这样就满足了开闭原则,并且对其他支付方式的业务逻辑也不会造成影响,扩展性很好。

JDK中使用策略模式的例子

在JDK中最经典的使用策略模式的例子就是Collections.sort(List<T> list, Comparator<? super T> c)方法,这个方法接受一个比较器Compartor参数,客户端在运行时可以传入一个比较器的实现,sort()方法中根据不同实现,按照不同的方式进行排序。

总结:

  • 如果在一个系统里面有许多类,它们仅仅在行为上有区别,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为;
  • 一个系统需要动态地在几种算法中选择一种;
  • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
http://www.lryc.cn/news/153171.html

相关文章:

  • 5-redis集群搭建安装
  • (数字图像处理MATLAB+Python)第十一章图像描述与分析-第七、八节:纹理描述和其他描述
  • MySQL提权
  • FPGA优质开源项目 – UDP万兆光纤以太网通信
  • 如何中mac上安装多版本python并配置PATH
  • window 常用基础命令
  • lintcode 1815 · 警报器 【simple vip 前缀和数组】
  • 【强化学习】MDP马尔科夫链
  • SpringBoot自写项目记录
  • Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune
  • 06-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景?【Java面试题总结】
  • 2021年06月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Tuxera NTFS for Mac2023苹果电脑Mac硬盘读写工具
  • 系统调用的过程
  • Python将多个文件的名称或后缀名由大写字母修改为小写的方法
  • Debezium的三种部署方式
  • 通讯协议057——全网独有的OPC HDA知识一之接口(十二)IOPCHDA_DataCallback
  • 后端SpringBoot+前端Vue前后端分离的项目(一)
  • docker 安装 MySQL5.7
  • 分布式session的4种解决方案
  • SQL Server2008下载地址
  • MySQL函数和约束
  • 关于一个git的更新使用流程
  • vue 对后端返回字段值为null的变成空字符串
  • C++,菱形继承和虚继承
  • js实现一行半文本的截取
  • 计算一个区间时间差值,时间保留剩下的差值
  • uniapp 微信小程序添加隐私保护指引
  • 行业追踪,2023-08-30
  • Redis——》Redis的部署方式对分布式锁的影响