1. 策略模式简介
策略模式(Strategy Pattern)是一种行为设计模式,它允许将算法独立于使用它的客户端进行变化。通过将不同的算法封装成不同的策略类,客户端可以在运行时动态地选择算法。策略模式符合开闭原则,可以提高代码的可扩展性和可维护性。
2. 策略模式的应用案例
2.1 场景描述
假设我们正在开发一个电商网站,需要实现一个促销活动,针对不同类型的商品计算不同的折扣,并显示折后价格。现在我们希望使用策略模式来实现这个功能。
2.2 策略接口和具体策略类
我们首先定义一个策略接口,其中包含了一个计算折扣的方法:
interface DiscountStrategy {
public function calculateDiscount($price);
}
然后我们创建具体的策略类实现接口:
class RegularDiscountStrategy implements DiscountStrategy {
public function calculateDiscount($price) {
// 计算常规折扣
}
}
class SpecialDiscountStrategy implements DiscountStrategy {
public function calculateDiscount($price) {
// 计算特殊折扣
}
}
class NoDiscountStrategy implements DiscountStrategy {
public function calculateDiscount($price) {
// 不打折
}
}
2.3 上下文类
上下文类负责接收客户端传递的策略对象,并调用其方法进行计算:
class PriceCalculator {
protected $discountStrategy;
public function setDiscountStrategy(DiscountStrategy $discountStrategy) {
$this->discountStrategy = $discountStrategy;
}
public function calculateFinalPrice($price) {
$discount = $this->discountStrategy->calculateDiscount($price);
$finalPrice = $price - $discount;
return $finalPrice;
}
}
2.4 客户端代码
$calculator = new PriceCalculator();
$calculator->setDiscountStrategy(new RegularDiscountStrategy());
$finalPrice = $calculator->calculateFinalPrice(100);
echo "常规折扣后的价格:" . $finalPrice . "";
$calculator->setDiscountStrategy(new SpecialDiscountStrategy());
$finalPrice = $calculator->calculateFinalPrice(100);
echo "特殊折扣后的价格:" . $finalPrice . "";
$calculator->setDiscountStrategy(new NoDiscountStrategy());
$finalPrice = $calculator->calculateFinalPrice(100);
echo "无折扣时的价格:" . $finalPrice . "";
3. 文章总结
本文详细介绍了策略模式的应用案例,通过定义策略接口和具体策略类,使用上下文类进行策略的切换,实现了不同类型商品的折扣计算。策略模式使得算法独立于客户端变化,并提高代码的可扩展性和可维护性。通过这个例子,我们可以更好地理解和应用策略模式。