PHP设计模式之装饰器模式

我们先看一个列子,很简单,添加一个商品信息,并且输出商品信息

/**
 * 商品
 */
class Goods
{
    // 定义商品列表
    public $goodList;
    
    public function __construct()
    {
        $this->goodList = [];
    }

    // 添加商品信息
    public function addGood($good)
    {
        $this->goodList[] = $good;
    }
    // 输出商品信息
    public function getGoodInfo()
    {
        foreach ($this->goodList as $key => $good) {
            $info = $good['name'] . ' ' . $good['attr'];
        }
        return $info;
    }
}

上述类中有一个添加商品的方法,还有一个输出商品信息的方法,调用方法,输出对象

$good = new Goods();
$good->addGood(['name' => '华为', 'attr' => 'P50']);
echo $good->getGoodInfo(); // 华为 P50

如果这时候PM提了一个需求,要求在部分商品名称前面加上’特惠’二字,我们改如何实现呢?那无疑是非常简单的,大部分人首选会想到的是在上述getGoodInfo方法中做判断加if来区别,这是一个非常好的方案,但是有没有想过如果PM还有其他需求要怎么办呢,继续加if么?那这个方法是不是会出现很多的if else,这显然就不是一个可读性很强的代码了,而且你在上述getGoodInfo方法继续添加逻辑,很可能会导致老代码的不可用,测试需要通盘测试,增加了测试的压力,而这个时候装饰器就可以非常好的解决该问题,在不改动老代码的基础上实现新的需求。

/**
 * 装饰器
 */
class GoodsListDecoratorCaps
{
    private $_goods;
    // 构造方法
    function __construct(Goods $goods)
    {
        $this->_goods = $goods;
    }
	// 重新定义输出方式
    public function makeCaps()
    {
        foreach ($this->_goods->goodList as $key => $good) {
            $info = '特惠 ' . $good['name'] . ' ' . $good['attr'];
        }
        return $info;
    }
}


$newgood = new Goods();
$newgood->addGood(['name' => '华为', 'attr' => 'nova8 SE']);
$goodCaos = new GoodsListDecoratorCaps($newgood);

echo $goodCaos->makeCaps(); // 特惠 华为 nova8 SE

撸优雅的代码,撸别人想看的代码,而不是别人一看你的代码就皱眉头!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值