1. 策略模式概述
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用算法的客户端。这种模式使得算法可以独立于客户端的变化而变化。
在软件开发中,经常会遇到需要根据不同的情况选择不同的算法来解决问题的情况,如果在代码中直接编写所有的算法,会导致代码复杂且难以维护。策略模式提供了一种将算法封装并抽象出来的方式,使得算法可以独立于客户端的变化而变化,使代码更具有可维护性和可扩展性。
2. 策略模式结构
策略模式由三个角色组成:
环境类(Context):负责使用具体策略对象的类。通常在环境类中维持一个抽象策略类的引用,用于调用策略对象的算法。
抽象策略类(Strategy):定义了一个公共接口,用于让具体策略类来实现。
具体策略类(ConcreteStrategy):实现了抽象策略类定义的算法。
3. 策略模式示例
3.1 需求分析
假设有一个电商平台,需要根据不同的会员等级计算商品的折扣价格。根据会员等级不同,折扣算法也不同。
3.2 定义抽象策略类
interface DiscountStrategy {
public function calculate($price);
}
3.3 实现具体策略类
class RegularMemberDiscount implements DiscountStrategy {
public function calculate($price) {
// 普通会员计算折扣价格的算法
$discountedPrice = $price * 0.9;
echo "普通会员折扣价格:" . $discountedPrice . "\n";
}
}
class VIPMemberDiscount implements DiscountStrategy {
public function calculate($price) {
// VIP会员计算折扣价格的算法
$discountedPrice = $price * 0.8;
echo "VIP会员折扣价格:" . $discountedPrice . "\n";
}
}
3.4 定义环境类
class DiscountCalculator {
private $strategy;
public function __construct($strategy) {
$this->strategy = $strategy;
}
public function calculateDiscount($price) {
$this->strategy->calculate($price);
}
}
3.5 使用策略模式计算折扣价格
$price = 100.0;
$regularMemberDiscount = new RegularMemberDiscount();
$vipMemberDiscount = new VIPMemberDiscount();
$calculator = new DiscountCalculator($regularMemberDiscount);
$calculator->calculateDiscount($price);
$calculator = new DiscountCalculator($vipMemberDiscount);
$calculator->calculateDiscount($price);
4. 策略模式总结
策略模式是一种常用的设计模式,可在需要灵活选择算法的场景中提供一种解决方案。通过使用策略模式,可以将算法封装并独立于客户端代码进行维护和扩展,提高系统的可维护性和可扩展性。
在本文示例中,通过抽象策略类和具体策略类的定义,将会员折扣算法与环境类解耦,实现了算法的独立变换。这样,在将来添加新的会员等级或调整折扣算法时,不会影响到客户端的代码,代码的复用性也变得更好。