时间:2025-03-06 22:37
人气:
作者:admin
策略(Strategy)模式属于行为型模式的一种。
策略模式的核心思想是定义一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户而变化,从而实现了算法族的独立扩展和替换。
策略模式指在一个方法中,某些关键步骤的算法依赖调用方传入的策略,传入不同的策略,即可获得不同的结果,大大增强了系统的灵活性。
策略模式的核心思想是在一个计算方法中把容易变化的算法抽出来作为“策略”参数传进去,如果新增策略的话,则不必修改原有逻辑。
策略模式适用于以下场景:
策略模式通常有以下组成部分:
我们模拟实现一个支付方式的选择功能,不同的支付方式(如信用卡支付和PayPal支付)封装为不同的策略。
1、策略接口:定义支付算法
// 策略接口:定义支付算法
public interface PaymentStrategy {
void pay(int amount);
}
2、具体策略类
// 具体策略类1:信用卡支付
public class CreditCardPaymentStrategy implements PaymentStrategy {
private String cardNumber;
public CreditCardPaymentStrategy(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("Using Credit Card (" + cardNumber + ") to pay " + amount + " dollars.");
}
}
// 具体策略类2:PayPal支付
public class PaypalPaymentStrategy implements PaymentStrategy {
private String email;
public PaypalPaymentStrategy(String email) {
this.email = email;
}
@Override
public void pay(int amount) {
System.out.println("Using PayPal (" + email + ") to pay " + amount + " dollars.");
}
}
3、上下文类:购物车(或支付环境)
// 上下文类:购物车(或支付环境)
public class ShoppingCart {
// 持有一个策略对象
private PaymentStrategy paymentStrategy;
// 设置策略(可在运行时动态切换)
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 结账时调用支付策略
public void checkout(int amount) {
if (paymentStrategy == null) {
throw new IllegalStateException("Payment strategy not set.");
}
paymentStrategy.pay(amount);
}
}
4、客户端
// 客户端代码
public class StrategyPatternDemo {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 使用信用卡支付
cart.setPaymentStrategy(new CreditCardPaymentStrategy("1234-5678-9012-3456"));
cart.checkout(150);
// 切换为PayPal支付
cart.setPaymentStrategy(new PaypalPaymentStrategy("user@example.com"));
cart.checkout(250);
}
}
策略模式的优缺点。
优点:
缺点:
装饰模式可以更改对象的外表,策略模式则能够改变其本质。
策略模式通过将算法封装在独立的策略类中,并在运行时动态选择算法,提供了一种灵活、可扩展的解决方案,能够有效地消除冗长的条件语句,提高系统的可维护性和扩展性。熟练掌握策略模式不仅可以优化代码结构,还可以应对复杂业务场景下的算法替换问题。
人生一切所谓的苦难,都是比较而言。-- 烟沙九洲
上一篇:状态模式