模板和策略设计模式联合使用的demo

在联合使用模板设计模式和策略设计模式时,我们可以定义一个模板类,该类包含了一些固定步骤的算法,并在其中使用策略接口来允许子类提供不同的实现。这样,我们可以在不改变算法结构的情况下改变算法中的某些步骤。

以下是一个简单的例子,展示了如何联合使用模板设计模式和策略设计模式:

首先,我们定义一个策略接口:

java 复制代码
public interface PaymentStrategy {
    void pay(double amount);
}

然后,我们实现两种支付策略:

java 复制代码
public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying with credit card for amount: " + amount);
    }
}

public class BankTransferPayment implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("Paying with bank transfer for amount: " + amount);
    }
}

接下来,我们定义一个模板类,它接受一个支付策略对象,并在其算法中使用这个策略对象:

java 复制代码
public abstract class PaymentProcessor {
    private PaymentStrategy strategy;

    public PaymentProcessor(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void processPayment(double amount) {
        // 固定步骤1:准备支付环境
        prepareEnvironment();

        // 策略步骤:执行支付
        strategy.pay(amount);

        // 固定步骤2:支付后处理
        postProcessPayment();
    }

    // 模板方法,固定步骤的实现
    protected void prepareEnvironment() {
        System.out.println("Preparing payment environment...");
    }

    // 模板方法,固定步骤的实现
    protected void postProcessPayment() {
        System.out.println("Payment processed successfully!");
    }
}

最后,我们创建具体的支付处理器类,它们继承自PaymentProcessor并传入具体的支付策略:

java 复制代码
public class CreditCardPaymentProcessor extends PaymentProcessor {
    public CreditCardPaymentProcessor() {
        super(new CreditCardPayment());
    }

    // 可以重写固定步骤,如果需要的话
    @Override
    protected void prepareEnvironment() {
        System.out.println("Verifying credit card details...");
    }
}

public class BankTransferPaymentProcessor extends PaymentProcessor {
    public BankTransferPaymentProcessor() {
        super(new BankTransferPayment());
    }

    // 可以重写固定步骤,如果需要的话
    @Override
    protected void prepareEnvironment() {
        System.out.println("Checking bank account balance...");
    }
}

现在,我们可以使用这些支付处理器来执行支付:

java 复制代码
public class Main {
    public static void main(String[] args) {
        PaymentProcessor creditCardProcessor = new CreditCardPaymentProcessor();
        creditCardProcessor.processPayment(100.0);

        PaymentProcessor bankTransferProcessor = new BankTransferPaymentProcessor();
        bankTransferProcessor.processPayment(200.0);
    }
}

输出结果:

csharp 复制代码
Verifying credit card details...
Paying with credit card for amount: 100.0
Payment processed successfully!
Checking bank account balance...
Paying with bank transfer for amount: 200.0
Payment processed successfully!

在这个例子中,PaymentProcessor是模板类,它定义了支付处理的算法骨架,而PaymentStrategy是策略接口,允许我们提供不同的支付实现。CreditCardPaymentProcessor和BankTransferPaymentProcessor是具体的支付处理器,它们通过组合PaymentProcessor和具体的策略对象来提供不同的支付功能。

相关推荐
专业程序开发源3 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
打工仔折腾 AI3 小时前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战
vx_Biye_Design3 小时前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
嵌入式学习菌3 小时前
ESP32 ModbusTCP 分片缓存
java·后端·spring
程序员小杰@3 小时前
Spring Boot 常用注解分类速记
java·spring boot·后端
挖掘狂人3 小时前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
vx_Biye_Design3 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
打工仔折腾 AI3 小时前
用UU远程把家里电脑变成AI Agent常驻服务器:CLI、端口映射与代理实测
运维·服务器·人工智能·后端·python·电脑·ai agent 实战
明月_清风4 小时前
AI Agent 进入系统层:现在有哪些开源项目在解决这个问题?
人工智能·后端
弈栈录4 小时前
MySQL 事务、索引与锁:后端开发必须掌握的数据库基础
数据库·后端