设计模式是在软件开发中用来解决特定问题的可重用解决方案。它们是在众多项目中反复出现的问题的通用解决方法,被广泛地认可和应用。今天,我们将深入探讨一种非常有用的行为型设计模式——策略模式,它允许在运行时选择算法的行为。
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。这意味着,如果你有一些不同的业务算法或逻辑,并且希望在运行时根据条件动态切换这些逻辑,那么策略模式是一个非常好的选择。
让我们通过一个简单的例子来看看策略模式是如何工作的。假设我们正在创建一个电商系统,其中有不同类型的用户折扣策略。
首先,我们定义一个策略接口 DiscountStrategy
,它包含了一个方法 applyDiscount
:
interface DiscountStrategy {
double applyDiscount(double price);
}
然后,我们实现几个具体的折扣策略类,比如 FidelityDiscount
、BulkDiscount
和 NoDiscount
:
class FidelityDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.9; // 10% off for fidelity members
}
}
class BulkDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.85; // 15% off for buying in bulk
}
}
class NoDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price; // no discount
}
}
接下来,我们需要一个上下文类 ShoppingCart
,它将使用 DiscountStrategy
:
class ShoppingCart {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double getFinalPrice(double price) {
return strategy.applyDiscount(price);
}
}
现在,我们可以在运行时改变 ShoppingCart
使用的折扣策略:
public class StrategyPatternDemo {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setStrategy(new FidelityDiscount());
System.out.println("Total with fidelity discount: " + cart.getFinalPrice(100)); // Output: 90.0
cart.setStrategy(new BulkDiscount());
System.out.println("Total with bulk discount: " + cart.getFinalPrice(100)); // Output: 85.0
cart.setStrategy(new NoDiscount());
System.out.println("Total with no discount: " + cart.getFinalPrice(100)); // Output: 100.0
}
}
在这个例子中,ShoppingCart
不需要知道具体的折扣计算细节,它只需要知道每个折扣策略都遵循相同的 DiscountStrategy
接口。这样,新增或者更换折扣策略时,我们无需修改 ShoppingCart
类的代码,符合开闭原则。
策略模式非常适合用于实现不同的业务规则或算法,同时保持客户端代码的简洁性和扩展性。在实际应用中,你可以根据具体需求将策略模式应用于多种场合,例如创建不同类型的日志记录器、实现不同的缓存策略等。通过这种方式,策略模式可以帮助我们编写更加灵活且可维护的代码。