Java中两独立函数执行后调用公共函数的设计模式及实现方案
支付完成后自动触发短信通知的设计方案
推荐设计模式:模板方法模式
模板方法模式是该场景下的最优选择,它能将**固定流程(支付完成后发送短信)与可变步骤(不同支付方式的具体逻辑)**分离,既避免重复代码,又能保证流程一致性。
实现步骤
- 定义抽象支付类,封装固定流程并声明抽象的具体支付逻辑:
public abstract class PaymentProcessor { // 模板方法:固化支付+通知的完整流程 public final void processPayment(Long amount) { // 执行具体支付操作 doPayment(amount); // 统一执行短信通知 sendSMS(); } // 抽象方法:子类实现不同支付方式的核心逻辑 protected abstract void doPayment(Long amount); // 公共短信发送逻辑 private void sendSMS() { // 此处编写实际短信发送代码 System.out.println("发送支付成功通知短信"); } }
- 针对信用卡、现金支付分别实现子类:
public class CreditCardPaymentProcessor extends PaymentProcessor { private String cardNumber; public CreditCardPaymentProcessor(String cardNumber) { this.cardNumber = cardNumber; } @Override protected void doPayment(Long amount) { // 原有信用卡支付逻辑 System.out.println("使用信用卡 " + cardNumber + " 完成支付:" + amount + " 元"); } } public class CashPaymentProcessor extends PaymentProcessor { @Override protected void doPayment(Long amount) { // 原有现金支付逻辑 System.out.println("使用现金完成支付:" + amount + " 元"); } }
- 调用方式示例:
// 信用卡支付流程 PaymentProcessor ccProcessor = new CreditCardPaymentProcessor("4111-XXXX-XXXX-1111"); ccProcessor.processPayment(100L); // 现金支付流程 PaymentProcessor cashProcessor = new CashPaymentProcessor(); cashProcessor.processPayment(50L);
备选方案:装饰器模式
如果原有支付函数无法修改(比如属于遗留代码),装饰器模式是更灵活的选择,它可以在不改动原有类的前提下,动态添加短信通知功能。
实现步骤
- 定义支付操作接口:
public interface Payment { void markPaymentPaid(Long amount); }
- 实现原有支付逻辑类:
public class CreditCardPayment implements Payment { private String cardNumber; public CreditCardPayment(String cardNumber) { this.cardNumber = cardNumber; } @Override public void markPaymentPaid(Long amount) { System.out.println("使用信用卡 " + cardNumber + " 完成支付:" + amount + " 元"); } } public class CashPayment implements Payment { @Override public void markPaymentPaid(Long amount) { System.out.println("使用现金完成支付:" + amount + " 元"); } }
- 实现短信装饰器类:
public class PaymentWithSMSDecorator implements Payment { private Payment targetPayment; public PaymentWithSMSDecorator(Payment targetPayment) { this.targetPayment = targetPayment; } @Override public void markPaymentPaid(Long amount) { // 执行原有支付逻辑 targetPayment.markPaymentPaid(amount); // 添加短信通知 sendSMS(); } private void sendSMS() { System.out.println("发送支付成功通知短信"); } }
- 调用方式示例:
// 为信用卡支付添加短信通知 Payment ccPayment = new PaymentWithSMSDecorator(new CreditCardPayment("4111-XXXX-XXXX-1111")); ccPayment.markPaymentPaid(100L); // 为现金支付添加短信通知 Payment cashPayment = new PaymentWithSMSDecorator(new CashPayment()); cashPayment.markPaymentPaid(50L);
方案对比
- 模板方法模式:代码简洁,子类只需关注核心支付逻辑,强制保证流程一致性,但需要重构原有代码结构,定义抽象类。
- 装饰器模式:无需修改原有类,可动态扩展功能(后续可添加邮件通知等),但会增加类的数量,适合遗留代码场景。
内容的提问来源于stack exchange,提问作者Raj Saraogi
相关产品推荐
相关产品推荐

