1. 什么是策略模式
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端,客户端中的具体实现只需要了解上下文类。
2. 由什么组成
- 策略接口(Strategy):定义所有支持的算法的公共接口,也就抽象接口
- 具体策略类(Concrete Strategy):实现策略接口的具体算法
- 上下文类(Context):持有一个策略对象的引用,通过策略接口与具体策略交互
3. 怎么实现
// 1. 策略接口
interface PaymentStrategy {
void pay(int amount);
}
// 2. 具体策略类
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("使用信用卡支付 " + amount + " 元,卡号:" + cardNumber);
}
}
class AlipayPayment implements PaymentStrategy {
private String account;
public AlipayPayment(String account) {
this.account = account;
}
@Override
public void pay(int amount) {
System.out.println("使用支付宝支付 " + amount + " 元,账户:" + account);
}
}
// 3. 上下文类
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
// 4. 客户端使用
public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 使用信用卡支付
cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));
cart.checkout(1000);
// 切换为支付宝支付
cart.setPaymentStrategy(new AlipayPayment("example@alipay.com"));
cart.checkout(500);
}
}
4. 应用的场景
比较常见的支付业务,需要根据具体的选择具体的支付方式
商品的不同折扣策略
压缩工具的压缩算法的选择
游戏角色的不同攻击策略
5. 优点和缺点
5.1. 优点
- 松耦合:策略模式将不同的策略封装在独立的类中,与上下文对象解耦,增加了代码的灵活性和可维护性。
- 易于扩展:可以通过添加新的策略类来扩展系统的功能,无需修改现有代码。
- 符合开闭原则:对于新的策略,无需修改上下文对象,只需要实现新的策略接口即可
5.2. 缺点
- 类数量增多:每个具体策略都需要一个独立的类,如果策略较多,将导致类的数量增加。
- 上层必须知道所有策略类:客户端必须知道有哪些策略,并选择合适的策略进行使用,也就是说客户端必须对策略有一个详细的了解。