php策略模式实现
策略模式简介
策略模式(Strategy Pattern)属于行为型设计模式,允许在运行时动态选择算法或行为。它将算法封装成独立的类,使得它们可以互相替换,而不影响客户端代码。
核心组成部分
- 策略接口(Strategy Interface):定义所有具体策略的通用方法。
- 具体策略类(Concrete Strategies):实现策略接口,提供具体的算法实现。
- 上下文类(Context):持有一个策略对象的引用,通过接口与策略交互。
实现步骤
定义策略接口
创建一个接口或抽象类,声明策略的通用方法。

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 ShoppingCart {
private PaymentStrategy $paymentStrategy;
public function setPaymentStrategy(PaymentStrategy $strategy): void {
$this->paymentStrategy = $strategy;
}
public function checkout(float $amount): void {
$this->paymentStrategy->pay($amount);
}
}
客户端调用示例
动态切换策略并执行支付。
$cart = new ShoppingCart();
// 使用信用卡支付
$cart->setPaymentStrategy(new CreditCardPayment());
$cart->checkout(100.50);
// 切换为 PayPal 支付
$cart->setPaymentStrategy(new PayPalPayment());
$cart->checkout(75.25);
优势与适用场景
- 优势:避免多重条件判断,提高代码扩展性,符合开闭原则。
- 适用场景:需要动态切换算法(如支付方式、排序算法、数据压缩策略等)。
完整代码示例
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 ShoppingCart {
private PaymentStrategy $paymentStrategy;
public function setPaymentStrategy(PaymentStrategy $strategy): void {
$this->paymentStrategy = $strategy;
}
public function checkout(float $amount): void {
$this->paymentStrategy->pay($amount);
}
}
// 客户端代码
$cart = new ShoppingCart();
$cart->setPaymentStrategy(new CreditCardPayment());
$cart->checkout(100.50);
$cart->setPaymentStrategy(new PayPalPayment());
$cart->checkout(75.25);
通过以上实现,可以灵活扩展新的支付方式(如新增 BitcoinPayment 类),而无需修改上下文类。






