我们先看一个列子,很简单,添加一个商品信息,并且输出商品信息
/**
* 商品
*/
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
撸优雅的代码,撸别人想看的代码,而不是别人一看你的代码就皱眉头!!!