行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。这种模式定义了一系列的算法,将每一个算法封装起来,并且使它们可以相互替换。通过这种方式,客户端可以在不改变其代码的情况下改变使用的算法。
在策略模式中,通常会有三个角色:
- 上下文(Context):它持有一个指向策略对象的引用,负责将请求委托给这个对象。
- 策略(Strategy):它是一个接口或抽象类,定义了一个算法族,使它们可以相互替换。
- 具体策略(Concrete Strategy):实现了策略接口的具体算法。
这种模式使得算法可以独立于其使用者而变化,同时也简化了算法的替换和扩展。通常情况下,策略模式在需要多种算法选择时非常有用,例如排序算法、数据压缩等。
下面举个实际的例子加深对策略模式的理解
示例
假设我们正在开发一个电商平台,需要根据不同的促销活动计算最终的价格。这是一个很好的策略模式的应用场景。
首先,我们定义一个 `PriceCalculator
` 接口作为策略接口,其中包含了计算最终价格的方法。然后,我们创建具体的促销策略类,比如 `BlackFridayStrategy
` 、`CyberMondayStrategy
` 、`ClearanceSaleStrategy
` 等,它们实现了 `PriceCalculator
` 接口,并分别实现了不同的价格计算逻辑。
接着,我们有一个 `Checkout
` 类作为上下文类,它接收不同的促销策略,并在结账时执行相应的策略来计算最终价格。
下面是一个简化的示例:
策略接口,每种策略都需要实现这个接口,并重写接口里的方法
// 定义策略接口
interface PriceCalculator {
double calculateFinalPrice(double initialPrice);
}
策略类,就是具体的策略,比如这里的每一种活动就是策略,再具体点就是周年庆活动的折扣和端午节活动的折扣是两种不同的策略
// 具体策略类
class BlackFridayStrategy implements PriceCalculator {
public double calculateFinalPrice(double initialPrice) {
return initialPrice * 0.5; // 50% off
}
}
class CyberMondayStrategy implements PriceCalculator {
public double calculateFinalPrice(double initialPrice) {
return initialPrice * 0.6; // 40% off
}
}
上下文类,这个类其实类似一个包装袋,袋子都是同一个袋子,但是袋子里的策略可以是不同的,最终运行的方法就是每个策略类里面重写的接口的方法
// 上下文类
class Checkout {
private PriceCalculator priceCalculator;
public Checkout(PriceCalculator priceCalculator) {
this.priceCalculator = priceCalculator;
}
public double calculateTotal(double initialPrice) {
return priceCalculator.calculateFinalPrice(initialPrice);
}
}
使用方式
// 使用示例
public class ShoppingCart {
public static void main(String[] args) {
double initialPrice = 100.0;
Checkout checkout = new Checkout(new BlackFridayStrategy());
System.out.println("Final price on Black Friday: $" + checkout.calculateTotal(initialPrice));
checkout = new Checkout(new CyberMondayStrategy());
System.out.println("Final price on Cyber Monday: $" + checkout.calculateTotal(initialPrice));
}
}
为了更好理解策略模式,一定要去代码里面运行一下感受一下策略模式的优雅