设计模式 策略模式

138 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 image.png

介绍

shiyanlou:策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

角色

角色说明
Context环境类,使用一个 ConcreteStrategy 对象来配置;维护一个对 Stategy 对象的引用,同时,可以定义一个接口来让 Stategy 访问它的数据
Strategy抽象策略类,定义所有支持的算法的公共接口。Context 使用这个接口来调用某 ConcreteStrategy 定义的算法
ConcreteStrategy具体策略类,实现 Strategy 接口的具体算法

角色示例

类名担任角色说明
OrderContext订单类
PayMethodStrategy支付方式类
BankCardConcreteStrategy银行卡支付类
HuabeiConcreteStrategy花呗支付类
YuEBaoConcreteStrategy余额宝支付类

UML类图

image.png

代码

<?php 
abstract class PayMethod
{
    abstract function pay();
}

class BankCard extends PayMethod
{
    public function pay()
    {
        return "更换银行卡支付".PHP_EOL;
    }
}

class Huabei extends PayMethod
{
    public function pay()
    {
        return "更换花呗支付".PHP_EOL;
    }
}

class YuEBao extends PayMethod
{
    public function pay()
    {
        return "更换余额宝支付".PHP_EOL;
    }
}

class Order
{
    protected $payMethod;

    public function setPayMethod(PayMethod $payMethod)
    {
        $this->payMethod = $payMethod;
    }

    public function pay()
    {
        return $this->payMethod->pay();
    }
}

$order = new Order();
$bankCard = new BankCard();
$yuEBao = new yuEBao();
$huabei = new Huabei();
$order->setPayMethod($bankCard);
echo $order->pay();
$order->setPayMethod($yuEBao);
echo $order->pay();
$order->setPayMethod($huabei);
echo $order->pay();

创建 Pay.php,内容如上。

执行

$ php Pay.php
更换银行卡支付
更换余额宝支付
更换花呗支付