版权声明:欢迎转载,请标明出处~ https://blog.csdn.net/chenshuai1993/article/details/79548232
装饰模式(Decorator)动态的给一个对象添加一些额外的职责,就增加功能来讲,装饰模式比子类更加灵活[DP]
标准UML
php-装饰模式
<?php
#饮料类
abstract class drinks
{
public $name;
abstract public function desc();
}
# 具体饮料类 咖啡
class coffee extends drinks
{
public function __construct()
{
$this->name = '咖啡';
}
public function desc()
{
echo $this->name;
}
}
#饮料混合类
/*abstract class drinkMix extends drinks
{
public function __construct()
{
$this->name = '饮料';
}
public function desc()
{
//
}
}*/
#当装饰器只有一种的时候,可以写在一起,比如本文的 desc, 就是写死的
class drinkMix extends drinks
{
public $hoidle;
public function __construct(drinks $drinks)
{
if ($drinks instanceof drinks) {
$this->hoidle = $drinks;
} else {
die('error');
}
}
public function desc()
{
echo $this->hoidle->desc(), '加牛奶';
}
}
#饮料类
class milk extends drinkMix
{
public $hoidle;
public function __construct(drinks $drinks)
{
if($drinks instanceof drinks){
$this->hoidle = $drinks;
}else{
die('error');
}
}
public function desc()
{
echo $this->hoidle->desc(),'加牛奶';
}
}
#饮料类
class tea extends drinkMix
{
public $hoidle;
public function __construct(drinks $drinks)
{
if($drinks instanceof drinks){
$this->hoidle = $drinks;
}else{
die('error');
}
}
public function desc()
{
echo $this->hoidle->desc(),'加茶水';
}
}
$coffee = new coffee();
#$coffee = new drinkMix($coffee);
$coffee = new milk($coffee);
$coffee = new tea($coffee);
$coffee->desc();
总结: 看懂UML是理解的关键