转载请注明作者和出处:https://www.jianshu.com/p/8d6c7673d6ed
运行平台: Windows
php版本: php7.0
装饰器模式在不必改变原类文件和使用继承的情况下,动态地扩展每一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
角色
- 组件对象的接口:可以给这些对象动态的添加指责;
- 所有装饰器的父类:需要定义一个与组件接口一致的接口,并持有一个compoent对象,该对象其实就是被装饰的对象;
- 组件对象的接口:可以给这些对象动态的添加指责;
查了很多资料,发现还是大话设计模式中对装饰器模式比较通俗易懂的解释,装饰器模式就是为已有的功能动态的修饰的一种方式。
相关英文单词:decorator
为了计算一块区域的价值,我们的代码如下
// 区域抽象类
abstract class Area
{
abstract public function treasure();
}
//森林类,价值100
class Forest extends Area
{
public function treasure()
{
return 100;
}
}
//沙漠类,价值10
class Desert extends Area
{
public function treasure()
{
return 10;
}
}
这里的代码没啥问题,可是当出现被破坏的森林或者沙漠里的一片绿洲那怎么半,如果一直增加子类,那么会出现无数的子类,管理起来特别麻烦,那么我们就可以针对他们做一个装饰器来组合和修改这些功能;
// 区域抽象类
abstract class Area
{
abstract public function treasure();
}
//森林类,价值100
class Forest extends Area
{
public function treasure()
{
return 100;
}
}
//沙漠类,价值10
class Desert extends Area
{
public function treasure()
{
return 10;
}
}
//区域类的装饰器类
abstract class AreaDecorateor extends Area
{
protected $_area = null;
public function __construct(Area $area)
{
$this->_area = $area;
}
}
//被破坏了后的区域,价值只有之前的一半
class Damaged extends AreaDecorateor
{
public function treasure()
{
return $this->_area->treasure() * 0.5;
}
public function oases_treasure()
{
return $this->_area->treasure() *1.5;
}
}
//现在我们获取绿洲的价值
$damageForest = new Damaged(new Desert());
echo $damageForest-> oases_treasure(); //返回15
//现在我们来获取被破坏的森林类的价值
$damageForest = new Damaged(new Forest());
echo $damageForest->treasure(); //返回50
这样我们只需要添加两行代码就可以完成这个很小的变化,在不修改原先对象结构的前提下,对现有现象的内容和功能性稍加,就应当使用装饰器设计模式。
网友评论