策略模式
定义:策略模式是一种行为设计模式,在运行时改变对象的行为。
目的:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。
结构:
- 策略接口:声明了所有支持的所有算法的公共接口。
- 具体策略:实现了策略接口中声明的算法
- 上下文:使用某个具体策略实例时,通常上下文会提供一个接口供客户端调用,内部则根据设定的策略来执行相应的算法。
支付系统【场景再现】
场景:支付系统 ,支付系统拥有多种不同的支付策略(信用卡,支付宝支付,微信支付)
硬编码完成不同的支付策略
依据传入支付策略不同,进行大量的
if...else
判断,倘若后续加入其他的第三方支付策略,则需要接着if...else
代码冗余,耦合度搞,难以扩展(添加新的支付方式,必须修改processPayment
方法)
public class Payment {
public void processPayment(double amount, String paymentMethod) {
if ("creditCard".equals(paymentMethod)) {
System.out.println("Paying " + amount + " using credit card.");
} else if ("alipay".equals(paymentMethod)) {
System.out.println("Paying " + amount + " using Alipay.");
} else if ("wechat".equals(paymentMethod)) {
System.out.println("Paying " + amount + " using WeChat.");
} else {
throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);
}
}
}
测试类:
public class Client {
public static void main(String[] args) {
Payment payment = new Payment();
payment.processPayment(100.0, "creditCard");
payment.processPayment(200.0, "alipay");
payment.processPayment(300.0, "wechat");
}
}
使用策略模式,对比不同
- 定义一个支付策略接口
- 实现具体的支付策略类
- 创建一个上下文类来使用具体的支付策略
(1)支付策略接口
public interface PaymentStrategy {
void pay(double amount);
}
(2)具体的支付策略类
- 信用卡支付策略
public class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using credit card.");
}
}
- 支付宝策略
public class AlipayPayment implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using Alipay.");
}
}
- 微信支付策略
public class WeChatPayment implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using WeChat.");
}
}
(3)上下文
public class PaymentContext {
private PaymentStrategy paymentStrategy;
// 构造器注入策略
public PaymentContext(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void processPayment(double amount) {
paymentStrategy.pay(amount);
}
}
(4)客户端
public class Client {
public static void main(String[] args) {
// 创建不同的支付策略
PaymentStrategy creditCardPayment = new CreditCardPayment();
PaymentStrategy alipayPayment = new AlipayPayment();
PaymentStrategy weChatPayment = new WeChatPayment();
// 使用不同的支付策略
PaymentContext context = new PaymentContext(creditCardPayment);
context.processPayment(100.0);
context = new PaymentContext(alipayPayment);
context.processPayment(200.0);
context = new PaymentContext(weChatPayment);
context.processPayment(300.0);
}
}
(5)小结
策略模式:
- 定义一个支付策略接口
PaymentStrategy
- 实现三个具体的支付策略类
CreditCardPayment
,AlipayPayment
和WeChatPayment
。 - 上下文类
PaymentContext
,来使用具体的支付策略 - 客户端测试代码中动态选择不同的支付层策略
策略模式主要关注的是算法或行为的选择和封装。它允许在运行时动态地选择不同的算法或行为。
策略模式适用于需要在运行时选择不同的算法或行为的情况。例如,不同的排序算法、支付方式等。