php策略模式实现
策略模式简介
策略模式(Strategy Pattern)属于行为型设计模式,允许在运行时动态选择算法或行为。它将算法封装成独立的类,使得它们可以互相替换,而不影响客户端代码。
核心组成部分
- 策略接口(Strategy Interface):定义所有支持的算法或行为的公共接口。
- 具体策略类(Concrete Strategies):实现策略接口的具体算法。
- 上下文类(Context):持有一个策略对象的引用,并通过策略接口调用具体算法。
PHP实现示例
定义策略接口
interface PaymentStrategy {
public function pay(float $amount): void;
}
实现具体策略类
class CreditCardPayment implements PaymentStrategy {
public function pay(float $amount): void {
echo "Paying $amount via Credit Card.\n";
}
}
class PayPalPayment implements PaymentStrategy {
public function pay(float $amount): void {
echo "Paying $amount via PayPal.\n";
}
}
class BankTransferPayment implements PaymentStrategy {
public function pay(float $amount): void {
echo "Paying $amount via Bank Transfer.\n";
}
}
实现上下文类
class PaymentContext {
private PaymentStrategy $strategy;
public function __construct(PaymentStrategy $strategy) {
$this->strategy = $strategy;
}
public function setPaymentStrategy(PaymentStrategy $strategy): void {
$this->strategy = $strategy;
}
public function executePayment(float $amount): void {
$this->strategy->pay($amount);
}
}
客户端调用
$amount = 100.50;
// 使用信用卡支付
$context = new PaymentContext(new CreditCardPayment());
$context->executePayment($amount);
// 动态切换为 PayPal 支付
$context->setPaymentStrategy(new PayPalPayment());
$context->executePayment($amount);
关键优势
- 灵活扩展:新增支付方式只需添加新的策略类,无需修改现有代码。
- 解耦:客户端代码与具体算法分离,降低耦合度。
- 运行时切换:通过
setPaymentStrategy动态更换策略。
实际应用场景
- 支付方式选择(如示例)。
- 排序算法(快速排序、冒泡排序等动态切换)。
- 数据压缩(ZIP、RAR 等不同压缩策略)。
通过策略模式,可以优雅地解决需要频繁变更算法或行为的场景。







