策略模式是一种行为型设计模式,定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现,而不是在编译时固定使用某个算法。策略模式通常包含三个主要角色:环境(Context)、抽象策略(Strategy)和具体策略(ConcreteStrategy)。
策略模式通常在以下场景中使用:
多算法选择:
当一个系统需要支持多种算法,并且需要在运行时动态选择其中一种算法时,可以使用策略模式
算法具有相同接口:
当多个算法实现具有相同的接口时,可以使用策略模式。这样可以在不修改客户端的情况下轻松切换算法
避免使用条件语句:
当需要避免使用大量的条件语句来选择不同算法时,可以使用策略模式,将每个算法封装成一个策略类
下面通过一个简单的例子来演示策略模式的实现。假设有一个支付系统,我们可以使用策略模式来实现不同支付方式的选择。
抽象策略 - 支付策略 PaymentStrategy
package com.cheney.demo;
interface PaymentStrategy {
void pay(int amount);
}
具体策略 - 支付宝支付 AlipayStrategy
package com.cheney.demo;
class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用支付宝支付 " + amount);
}
}
具体策略 - 微信支付 WeChatPayStrategy
package com.cheney.demo;
class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用微信支付 " + amount);
}
}
具体策略 - 银行卡支付 CardPaymentStrategy
package com.cheney.demo;
class CardPaymentStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用银行卡支付 " + amount);
}
}
环境 - 支付上下文 PaymentContext
package com.cheney.demo;
class PaymentContext {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void processPayment(int amount) {
if (paymentStrategy != null) {
paymentStrategy.pay(amount);
} else {
System.out.println("未设置支付策略");
}
}
}
客户端启动器 Main
package com.cheney.demo;
public class Main {
public static void main(String[] args) {
// 使用策略模式实现支付系统
PaymentContext paymentContext = new PaymentContext();
PaymentStrategy alipayStrategy = new AlipayStrategy();
paymentContext.setPaymentStrategy(alipayStrategy);
paymentContext.processPayment(100);
PaymentStrategy weChatPayStrategy = new WeChatPayStrategy();
paymentContext.setPaymentStrategy(weChatPayStrategy);
paymentContext.processPayment(50);
PaymentStrategy cardPaymentStrategy = new CardPaymentStrategy();
paymentContext.setPaymentStrategy(cardPaymentStrategy);
paymentContext.processPayment(200);
}
}
在上述例子中,PaymentStrategy
是抽象策略,定义了支付策略的接口。AlipayStrategy
、WeChatPayStrategy
、CardPaymentStrategy
是具体策略,实现了支付策略的具体算法。PaymentContext
是环境类,维护一个对抽象策略的引用,并在运行时可以切换不同的具体策略。
在客户端中,我们使用策略模式实现了支付系统。通过设置不同的支付策略,可以轻松地选择不同的支付方式。
策略模式是一种用于定义一系列算法、并使它们可以互相替换的设计模式。通过使用策略模式,可以实现更加灵活和可维护的代码,减少了客户端和算法之间的耦合度。在实际开发中,策略模式常被用于实现算法的动态切换、减轻条件语句的使用等场景。通过合理使用策略模式,可以提高系统的可扩展性和可维护性。