策略模式是一种行为型设计模式。它允许在运行时选择算法的行为,使算法的行为可以独立于调用它的上下文而变化。
策略模式中通常有三个主要角色:
- 环境(Context):维护一个对策略的引用,调用所选策略的方法。
- 策略接口(Strategy):定义一个通用的算法接口。
- 策略具体实现(Concrete Strategy):实现算法接口,提供具体的算法实现。
策略模式的核心思想是将算法的实现与其调用分离。由于不同的策略具有不同的实现,因此可以在运行时选择适当的算法实现进行调用。这使得算法可以独立于其调用者而演化。另外,策略模式遵循了开放/封闭原则,因为可以轻松添加新的算法而不必修改现有算法的源代码。
golang实现代码:
// 策略接口
type PaymentMethod interface {
Pay(amount float64) string
}
// 策略具体实现
type CreditCardPayment struct{}
func (c *CreditCardPayment) Pay(amount float64) string {
return fmt.Sprintf("Paid $%.2f using Credit Card", amount)
}
type DebitCardPayment struct{}
func (d *DebitCardPayment) Pay(amount float64) string {
return fmt.Sprintf("Paid $%.2f using Debit Card", amount)
}
// 环境
type PaymentProcessor struct {
PaymentMethod PaymentMethod
}
func (p *PaymentProcessor) Process(amount float64) string {
return p.PaymentMethod.Pay(amount)
}
// 测试代码
creditCard := &CreditCardPayment{}
debitCard := &DebitCardPayment{}
paymentProcessor := &PaymentProcessor{PaymentMethod: creditCard}
fmt.Println(paymentProcessor.Process(100.00)) // Output: Paid $100.00 using Credit Card
paymentProcessor.PaymentMethod = debitCard
fmt.Println(paymentProcessor.Process(200.50)) // Output: Paid $200.50 using Debit Card
php实现代码:
// 策略接口
interface PaymentMethod {
public function pay($amount);
}
// 策略具体实现
class CreditCardPayment implements PaymentMethod {
public function pay($amount) {
return 'Paid $' . $amount . ' using Credit Card';
}
}
class DebitCardPayment implements PaymentMethod {
public function pay($amount) {
return 'Paid $' . $amount . ' using Debit Card';
}
}
// 环境
class PaymentProcessor {
protected $paymentMethod;
public function __construct(PaymentMethod $paymentMethod) {
$this->paymentMethod = $paymentMethod;
}
public function setPaymentMethod(PaymentMethod $paymentMethod) {
$this->paymentMethod = $paymentMethod;
}
public function process($amount) {
return $this->paymentMethod->pay($amount);
}
}
// 测试代码
$creditCard = new CreditCardPayment();
$debitCard = new DebitCardPayment();
$paymentProcessor = new PaymentProcessor($creditCard);
echo $paymentProcessor->process(100); // Output: Paid $100 using Credit Card
$paymentProcessor->setPaymentMethod($debitCard);
echo $paymentProcessor->process(200); // Output: Paid $200 using Debit Card
PaymentMethod
接口定义了付款的方法,CreditCardPayment
和 DebitCardPayment
分别是策略具体实现。PaymentProcessor
对象就是一个环境,初始化时指定了一个默认的策略。process
方法根据当前绑定的策略进行付款操作。这里通过 setPaymentMethod
方法更改策略,使得策略可以在运行时变化。