概述
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。
目的
策略模式的主要目的是定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。
使用场景
多个相关的类只区别在行为上:当几个类除了执行某些行为不同外,其他部分基本相同,可以将这些行为抽象成策略接口,各个类实现此接口。
需要在运行时切换算法:如果程序中需要根据不同的情况使用不同的算法,可以将这些算法封装成策略类,并在运行时动态选择使用哪一个。
算法使用条件易于在运行时确定:当选择哪种算法的条件可以在用户使用程序期间动态确定时,可以使用策略模式。
优点
算法的封装性好:每个算法都有自己的类,封装在一个类中,使得它易于切换、易于理解、易于扩展。
提高了代码的复用性:相同的行为可以被不同的环境重用。
提高了系统的灵活性:可以在运行时选择算法,使得算法的更换变得更加灵活。
缺点
客户端必须知道所有的策略类:客户端必须知道所有具体策略类,并自行决定使用哪一个,这增加了客户端的复杂度。
增加了系统复杂度:引入了许多策略类,可能会增加系统的理解和维护难度。
组成部分
策略接口(Strategy Interface):定义了所有支持的算法的公共接口。上下文使用这个接口来调用某一个具体策略定义的算法。
具体策略类(Concrete Strategy Classes):实现了策略接口,提供了具体的算法实现。
上下文类(Context Class):持有一个策略接口的引用。上下文类通常会有一个方法用于设置具体使用的策略对象,以便在运行时切换策略。
代码示例
// 策略接口
interface PaymentStrategy {
void pay(int amount);
}
// 具体策略类 - 信用卡支付
class CreditCardStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println(amount + " paid with credit/debit card");
}
}
// 具体策略类 - PayPal 支付
class PaypalStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println(amount + " paid using PayPal.");
}
}
// 上下文类
class ShoppingCart {
private List<Item> items;
// 省略添加商品等方法...
public void pay(PaymentStrategy paymentMethod){
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
// 客户端代码
public class ShoppingCartTest {
public static void main(String[ ] args) {
ShoppingCart cart = new ShoppingCart();
// 添加商品到购物车...
// 使用信用卡支付
cart.pay(new CreditCardStrategy());
// 或者使用PayPal支付
cart.pay(new PaypalStrategy());
}
}
在这个例子中,PaymentStrategy
是策略接口,CreditCardStrategy
和 PaypalStrategy
是具体策略类,而 ShoppingCart
类是上下文,它在运行时根据需要选择不同的支付策略。
策略模式为你的程序提供了一种灵活且可扩展的方式来处理算法和策略的变化,是解决许多设计问题的有效工具。
评论区