美文网首页
设计模式(三):装饰器模式

设计模式(三):装饰器模式

作者: 骑着母猪砍大象 | 来源:发表于2018-12-02 19:41 被阅读3次

转载请注明作者和出处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


这样我们只需要添加两行代码就可以完成这个很小的变化,在不修改原先对象结构的前提下,对现有现象的内容和功能性稍加,就应当使用装饰器设计模式。


相关文章

网友评论

      本文标题:设计模式(三):装饰器模式

      本文链接:https://www.haomeiwen.com/subject/ltsrcqtx.html