You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中两独立函数执行后调用公共函数的设计模式及实现方案

支付完成后自动触发短信通知的设计方案

推荐设计模式:模板方法模式

模板方法模式是该场景下的最优选择,它能将**固定流程(支付完成后发送短信)与可变步骤(不同支付方式的具体逻辑)**分离,既避免重复代码,又能保证流程一致性。

实现步骤

  1. 定义抽象支付类,封装固定流程并声明抽象的具体支付逻辑:
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("发送支付成功通知短信");
    }
}
  1. 针对信用卡、现金支付分别实现子类:
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 + " 元");
    }
}
  1. 调用方式示例:
// 信用卡支付流程
PaymentProcessor ccProcessor = new CreditCardPaymentProcessor("4111-XXXX-XXXX-1111");
ccProcessor.processPayment(100L);

// 现金支付流程
PaymentProcessor cashProcessor = new CashPaymentProcessor();
cashProcessor.processPayment(50L);

备选方案:装饰器模式

如果原有支付函数无法修改(比如属于遗留代码),装饰器模式是更灵活的选择,它可以在不改动原有类的前提下,动态添加短信通知功能。

实现步骤

  1. 定义支付操作接口:
public interface Payment {
    void markPaymentPaid(Long amount);
}
  1. 实现原有支付逻辑类:
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 + " 元");
    }
}
  1. 实现短信装饰器类:
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("发送支付成功通知短信");
    }
}
  1. 调用方式示例:
// 为信用卡支付添加短信通知
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:27:21