Java策略类实现

定义策略类接口

1
2
3
public interface PaymentStrategy {
    public void pay(int amount);
}

实现具体的支付策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//支付宝
public class AlipayPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paying " + amount + " using Alipay.");
    }
}

//微信
public class WechatPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paying " + amount + " using Wechat.");
    }
}

//信用卡
public class CreditCardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paying " + amount + " using Credit Card.");
    }
}

上下文类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void executePayment(int amount) {
        paymentStrategy.pay(amount);
    }
}

客户端代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class StrategyPatternDemo {
    public static void main(String[] args) {
        // 创建支付上下文
        PaymentContext paymentContext = new PaymentContext(new AlipayPaymentStrategy());

        // 执行支付操作
        paymentContext.executePayment(100);

        // 更改支付策略为微信支付
        paymentContext.setPaymentStrategy(new WechatPaymentStrategy());
        paymentContext.executePayment(200);

        // 更改支付策略为信用卡支付
        paymentContext.setPaymentStrategy(new CreditCardPaymentStrategy());
        paymentContext.executePayment(300);
    }
}

问什么要有一个上下文类

简化客户端代码

上下文类可以封装与策略相关的逻辑,使得客户端代码更加简洁和清晰。客户端不需要直接处理策略对象的创建和切换,而是通过上下文类来管理这些细节。

解耦

上下文类可以解耦客户端和策略对象之间的直接依赖关系。客户端只需要与上下文类交互,而不需要直接与具体的策略类交互。这使得客户端代码更加通用,减少了对具体策略类的依赖。

扩展性

上下文类可以提供额外的功能,如日志记录、事务管理、异常处理等。这些功能可以统一在上下文类中实现,而不需要在每个策略类中重复实现。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计