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

Java设计模式(二十二)策略模式

一、概述

策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的策略类,使得它们可以相互替换,而不影响使用算法的客户端。这样可以使客户端代码与具体算法的实现细节解耦,提高了代码的可维护性和扩展性。

在策略模式中,有三个主要角色:

  • 环境(Context):它持有一个策略对象,并在运行时调用策略对象的方法。
  • 抽象策略(Strategy):它定义了一个公共接口,用于封装不同的算法或行为。
  • 具体策略(Concrete Strategy):它实现了抽象策略接口,提供具体的算法或行为实现。

二、代码

下面是一个简单的策略模式的代码示例:

//1.抽象策略接口,支付策略
public interface PaymentStrategy {void pay(double amount);
}
//2.具体策略实现类,信用卡支付策略
public class CreditCardStrategy implements PaymentStrategy {private String name;private String cardNumber;private String cvv;public CreditCardStrategy(String name, String cardNumber, String cvv) {this.name = name;this.cardNumber = cardNumber;this.cvv = cvv;}public void pay(double amount) {System.out.println("Paying $" + amount + " with credit card: " + cardNumber);}
}
//3.具体策略实现类,PayPal支付策略
public class PayPalStrategy implements PaymentStrategy {private String email;private String password;public PayPalStrategy(String email, String password) {this.email = email;this.password = password;}public void pay(double amount) {System.out.println("Paying $" + amount + " with PayPal account: " + email);}
}
//4.策略环境类,购物车
public class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(double amount) {paymentStrategy.pay(amount);}
}
//5.测试类
public class Test {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用信用卡支付PaymentStrategy creditCardStrategy = new CreditCardStrategy("tom", "123456789", "123");cart.setPaymentStrategy(creditCardStrategy);cart.checkout(100.0);// 使用PayPal支付PaymentStrategy payPalStrategy = new PayPalStrategy("example@example.com", "password");cart.setPaymentStrategy(payPalStrategy);cart.checkout(200.0);}
}

在上面的代码中,我们定义了一个抽象策略接口 PaymentStrategy,它包含了一个支付方法 pay()。然后我们实现了两个具体策略类 CreditCardStrategyPayPalStrategy,分别表示使用信用卡支付和使用PayPal支付的具体算法实现。

在环境类 ShoppingCart 中,我们通过设置不同的支付策略对象,来决定使用何种支付方式进行结算。在测试代码中,我们创建了一个购物车对象 cart,然后使用信用卡支付和PayPal支付进行结算,分别设置了相应的支付策略对象。

http://www.lryc.cn/news/67257.html

相关文章:

  • 【沐风老师】一步一步教你在3dMax中进行UVW贴图和展开UVW的方法
  • Redis主从复制(搭建集群的一种方式)【故障转移,内存,回收】
  • 专业专注,极致体验,高端隐形智能晾衣机品牌邦先生官宣浙江卫视知名主持人沈涛为品牌代言人
  • SpringCloud使用SkyWalking实现分布式链路追踪1
  • 【牛客刷题专栏】0x28:JZ30 包含min函数的栈(C语言编程题)
  • 聚焦丨酷雷曼荣列XRMA联盟成员单位
  • 物联网架构和技术:如何实现物物互联和智能化控制
  • Linux系统查看CPU信息命令cat /proc/cpuinfo详细说明
  • RK3588旗舰32T人工智能多网口边缘智能网关交换机
  • 一行代码绘制高分SCI火山图
  • chmod是什么?cron是什么?
  • 励志长篇小说《周兴和》书连载之三 十五岁时做父亲
  • 文件一直处于修改状态 git checkout 无法还原的问题解决方法
  • Julia入门-3、Julia包管理工具
  • 选择正确的 Azure 存储服务
  • 隐语团队研究成果再创佳绩,两篇论文分别被USENIX ATC‘23和IJCAI‘23接收!
  • 美团数据指标体系搭建实战
  • prometheus实战之五:飞书通知告警
  • 【华为OD机试真题】不含101的数(python版)100%通过率 超详细代码注释 代码解读
  • 基于AT89C52单片机的交通信号灯设计
  • chatGPT4.0-基于Python+Appium的APPUI关键字驱动自动化测试框架demo
  • C++模板进阶
  • 【人力资源管理】第4集 免费开源ERP: Odoo 16 Appraisal员工绩效评估 构建一体化企业人力资源管理
  • 「AI 孙燕姿」翻唱华语乐坛歌曲爆红全网,AI 翻唱将带来哪些影响?是否会有版权等问题?
  • 路径规划算法:基于灰狼优化的路径规划算法- 附代码
  • 推荐系统综述
  • SQLIST数据库编程
  • vue2中操作对象的方法
  • 左值引用、右值引用,std::move() 的汇编解释
  • LiangGaRy-学习笔记-Day11