设计模式之策略模式,golang,php实现

程序员卷不动了 2023-03-18 PM 508℃ 0条

策略模式是一种行为型设计模式。它允许在运行时选择算法的行为,使算法的行为可以独立于调用它的上下文而变化。

策略模式中通常有三个主要角色:

  1. 环境(Context):维护一个对策略的引用,调用所选策略的方法。
  2. 策略接口(Strategy):定义一个通用的算法接口。
  3. 策略具体实现(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 接口定义了付款的方法,CreditCardPaymentDebitCardPayment 分别是策略具体实现。PaymentProcessor 对象就是一个环境,初始化时指定了一个默认的策略。process 方法根据当前绑定的策略进行付款操作。这里通过 setPaymentMethod 方法更改策略,使得策略可以在运行时变化。

标签: 设计模式

非特殊说明,本博所有文章均为博主原创。

评论啦~