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

美团 手撕策略模式

1.定义:策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。

2.核心组成:

(1)策略接口(Strategy):定义所有策略类必须实现的公共接口

(2)具体策略(Concrete Strategy):实现策略接口,封装具体的算法或行为

(3)上下文(Context):持有策略对象的引用,负责调用策略

3.策略模式的优点

(1)开闭原则:新增策略无需修改原有代码

(2)避免多重条件判断:消除了大量的if-else或switch-case

(3)提高可维护性:每种算法独立封装,便于理解和测试

(4)运行时切换:可以在运行时动态改变对象的行为

4.策略模式的缺点:

(1)策略类数量会增多

(2)客户端需要了解不同策略的区别,选择合适的策略。

5.适用场景:

(1)系统有多种处理方式,需要动态选择。

(2)需要避免使用多重条件判断。

(3)算法经常变化或扩展。

附代码:

// 策略接口:付款策略 interface PaymentStrategy { void pay(double amount); } // 信用卡付款策略实现类,用于创建信用卡支付对象 class CreditCardPayment implements PaymentStrategy { private String cardNumber; private String cardHolder; // 构造方法 public CreditCardPayment(String cardNumber, String cardHolder) { this.cardNumber = cardNumber; this.cardHolder = cardHolder; } // 成员方法 @Override public void pay(double amount) { System.out.printf("信用卡付款:%.2f元\n", amount); System.out.println("卡号:" + cardNumber); System.out.println("持卡人:" + cardHolder); } } // 支付宝付款策略实现类,用于创建支付宝支付对象 class AlipayPayment implements PaymentStrategy { private String account; public AlipayPayment(String account) { this.account = account; } @Override public void pay(double amount) { System.out.printf("支付宝付款:%.2f元\n", amount); System.out.println("账号:" + account); } } // 微信付款策略实现类,用于创建微信支付对象 class WechatPayment implements PaymentStrategy { private String phoneNumber; public WechatPayment(String phoneNumber) { this.phoneNumber = phoneNumber; } @Override public void pay(double amount) { System.out.printf("微信付款:%.2f元\n", amount); System.out.println("手机号:" + phoneNumber); } } // 现金付款策略实现类,用于创建现金支付对象 class CashPayment implements PaymentStrategy { @Override public void pay(double amount) { System.out.printf("现金付款:%.2f元\n", amount); System.out.println("请准备零钱"); } } // 上下文:订单 class Order { // 订单金额 private double amount; // 付款策略(接口类型),声明的接口类型,因此可以指向任何实现了PaymentStrategy的类(信用卡、支付宝、微信等) private PaymentStrategy paymentStrategy; // 构造方法:创建订单时传入金额,初始化amount public Order(double amount) { this.amount = amount; } // Setter方法,这是策略模式的核心,创建订单之后通过调用这个方法单独设置策略 // setPaymentStrategy方法要求传入一个PaymentStrategy类型的对象 public void setPaymentStrategy(PaymentStrategy strategy) { // 将传入的参数赋值给当前的成员变量 this.paymentStrategy = strategy; } // 执行方法 // 检查是否选择了付款方式 // 选择了之后,调用策略对象的pay方法完成付款 public void checkout() { if (paymentStrategy == null) { System.out.println("请选择付款方式"); return; } System.out.println("订单金额:" + amount + "元"); paymentStrategy.pay(amount); System.out.println("付款成功!\n"); } }

ACM模式:

import java.util.Scanner; // 策略接口:付款策略 interface PaymentStrategy { void pay(double amount); } // 信用卡付款策略实现类,用于创建信用卡支付对象 class CreditCardPayment implements PaymentStrategy { private String cardNumber; private String cardHolder; // 构造方法 public CreditCardPayment(String cardNumber, String cardHolder) { this.cardNumber = cardNumber; this.cardHolder = cardHolder; } // 成员方法 @Override public void pay(double amount) { System.out.printf("信用卡付款:%.2f元\n", amount); System.out.println("卡号:" + cardNumber); System.out.println("持卡人:" + cardHolder); } } // 支付宝付款策略实现类,用于创建支付宝支付对象 class AlipayPayment implements PaymentStrategy { private String account; public AlipayPayment(String account) { this.account = account; } @Override public void pay(double amount) { System.out.printf("支付宝付款:%.2f元\n", amount); System.out.println("账号:" + account); } } // 微信付款策略实现类,用于创建微信支付对象 class WechatPayment implements PaymentStrategy { private String phoneNumber; public WechatPayment(String phoneNumber) { this.phoneNumber = phoneNumber; } @Override public void pay(double amount) { System.out.printf("微信付款:%.2f元\n", amount); System.out.println("手机号:" + phoneNumber); } } // 现金付款策略实现类,用于创建现金支付对象 class CashPayment implements PaymentStrategy { @Override public void pay(double amount) { System.out.printf("现金付款:%.2f元\n", amount); System.out.println("请准备零钱"); } } // 上下文:订单 class Order { // 订单金额 private double amount; // 付款策略(接口类型),声明的接口类型,因此可以指向任何实现了PaymentStrategy的类(信用卡、支付宝、微信等) private PaymentStrategy paymentStrategy; // 构造方法:创建订单时传入金额,初始化amount public Order(double amount) { this.amount = amount; } // Setter方法,这是策略模式的核心,创建订单之后通过调用这个方法单独设置策略 // setPaymentStrategy方法要求传入一个PaymentStrategy类型的对象 public void setPaymentStrategy(PaymentStrategy strategy) { // 将传入的参数赋值给当前的成员变量 this.paymentStrategy = strategy; } // 执行方法 // 检查是否选择了付款方式 // 选择了之后,调用策略对象的pay方法完成付款 public void checkout() { if (paymentStrategy == null) { System.out.println("请选择付款方式"); return; } System.out.println("订单金额:" + amount + "元"); paymentStrategy.pay(amount); System.out.println("付款成功!\n"); } } // 主类 public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取订单金额 double amount = scanner.nextDouble(); // 创建一个新的订单对象 Order order = new Order(amount); // 读取付款方式:1-信用卡,2-支付宝,3-微信,4-现金 int type = scanner.nextInt(); switch (type) { case 1: scanner.nextLine(); // 消耗换行符 String cardNumber = scanner.nextLine(); String cardHolder = scanner.nextLine(); // 创建一个信用卡支付对象 // 将创建的对象设置给订单 order.setPaymentStrategy(new CreditCardPayment(cardNumber, cardHolder)); break; case 2: scanner.nextLine(); String alipayAccount = scanner.nextLine(); // 创建一个支付宝支付对象 // 将创建的对象设置给订单 order.setPaymentStrategy(new AlipayPayment(alipayAccount)); break; case 3: scanner.nextLine(); String phoneNumber = scanner.nextLine(); // 创建一个微信支付对象 // 将创建的对象设置给订单 order.setPaymentStrategy(new WechatPayment(phoneNumber)); break; case 4: // 创建一个现金支付对象 // 将创建的对象设置给订单 order.setPaymentStrategy(new CashPayment()); break; default: System.out.println("无效的付款方式"); return; } order.checkout(); scanner.close(); } }
http://www.jsqmd.com/news/760271/

相关文章:

  • 基于改进NSGA-Ⅲ的柔性车间调度问题多目标优化【附代码】
  • 氛围编码与规范驱动开发:人工智能时代软件开发的竞争与互补之道
  • 告别消息撤回困扰:Windows平台微信QQ防撤回工具完整指南
  • 杀戮尖塔2MOD(手机pc已实测可用❤️ 有联机 角色卡面美化(娘化
  • 透明计费与账单追溯,让每一分 token 消耗都清晰可见
  • SHAMISA:自监督无参考图像质量评估方法解析
  • 给硬件工程师的PCIe链路训练实战笔记:从Detect到L0,手把手调试LTSSM状态机
  • 从x86到ARM64,PHP容器镜像瘦身63%、启动提速2.8倍:基于openEuler 22.03 LTS的CI/CD流水线重构实录
  • 数据库会话监控工具:从原理到实践,打造高效数据库可观测性方案
  • ApiMocktle工具
  • R 4.5量化回测避坑手册(97.3%新手踩过的5大陷阱全曝光):从数据泄漏到幸存者偏差,一文封神
  • 架构图即代码:GitHub星标41.9k的Diagrams,用Python解放你的画图生产力
  • 01华夏之光永存・开源:黄大年茶思屋三十期1题|EDF调度 工程师直接上手保姆级落地手册 EDF调度时延上界计算+数据面近似实现 直接落地专项完整解法
  • 如何无限重置IDM试用期?终极解决方案让你告别30天限制!
  • 【网络安全】网络安全基础必备技能
  • AI辅助编程的边界——Cursor实战与工程判断力
  • 别再被英文劝退!用易语言+PHPStudy快速搭建你的第一个中文程序(附源码)
  • 自主系统中的人协同技术路径
  • TrollInstallerX终极实战指南:5步掌握iOS越狱应用安装核心技术
  • 00华夏之光永存·(开源):黄大年茶思屋第三十期题目总纲 【本期官方原题完整版·前置定调篇】
  • OpenPano实战指南:10个技巧提升全景拼接质量
  • WaveTools鸣潮工具箱:一键解锁游戏性能与数据管理新高度
  • 从UI到AXI4:手把手教你为Xilinx DDR3控制器切换接口(MIG IP配置详解)
  • 告别Diskpart恐惧症:保姆级命令行教程,一步步教你合并U盘分区并恢复单盘
  • 基于VSG的孤岛逆变器频率无差控制策略虚拟同步机【附代码】
  • 硅谷世纪审判:OpenAI总裁“认罪”,300亿股权与利益纠葛谁能胜诉?
  • 在Node.js后端服务中集成Taotoken实现稳定高效的大模型对话功能
  • 2026年4月全国无人便利店招商加盟:性价比与前景深度解析 - 2026年企业推荐榜
  • QQ音乐解码终极指南:qmcdump帮你3分钟解锁加密音乐文件
  • 告别盲调!用逻辑分析仪抓取STM32与AP3216C的IIC波形,深度解析通信时序与数据帧