关注我

    我的微信
在线咨询 x
在线咨询
有什么可以帮到你
点击咨询

PHP设计模式汇总(6)—— PHP装饰器模式

简介​装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它可以帮助您在一个对象上添加额外的行为,而又不影响同一类中的其他对象。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它可以帮助您在一个对象上添加额外的行为,而又不影响同一类中的其他对象。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。


角色:

组件对象的接口:  可以给这些对象动态的添加职责

所有装饰器的父类:  需要定义一个与组件接口一致的接口,并持有一个Component对象,该对象其实就是被装饰的对象

具体的装饰器类:  实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象


示例代码:

<?php

 
/**
 * 组件对象接口
 * Interface IComponent
 */
interface IComponent
{
    function Display();
}
 
/**
 * 待装饰对象
 * Class Person
 */
class Person implements IComponent
{
    private $name;
 
    function __construct($name)
    {
        $this->name=$name;
    }
 
    function Display()
    {
        echo "装扮:{$this->name}<br/>";
    }
}
 
/**
 * 所有装饰器父类
 * Class Clothes
 */
class Clothes implements IComponent
{
    protected $component;
 
    function Decorate(IComponent $component)
    {
        $this->component=$component;
    }
 
    function Display()
    {
        if(!empty($this->component))
        {
            $this->component->Display();
        }
    }
 
}
 
//------------------------------具体装饰器----------------
 
class PiXie extends Clothes
{
    function Display()
    {
        echo "皮鞋  ";
        parent::Display();
    }
}
 
class QiuXie extends Clothes
{
    function Display()
    {
        echo "球鞋  ";
        parent::Display();
    }
}
 
class Tshirt extends Clothes
{
    function Display()
    {
        echo "T恤  ";
        parent::Display();
    }
}
 
class Waitao extends Clothes
{
    function Display()
    {
        echo "外套  ";
        parent::Display();
    }
}


///////////////////////////////////////////////////////////////////////
// 测试代码

$Yaoming = new Person("姚明");
$aTai = new Person("A泰斯特");
 
$pixie = new PiXie();
$waitao = new Waitao();
 
$pixie->Decorate($Yaoming);
$waitao->Decorate($pixie);
$waitao->Display();
 
echo "<hr/>";
 
$qiuxie = new QiuXie();
$tshirt = new Tshirt();
 
$qiuxie->Decorate($aTai);
$tshirt->Decorate($qiuxie);
$tshirt->Display();


适用场景:


1、需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

2、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

3、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。


经典的设计模式:

PHP设计模式汇总(1)—— PHP简单工厂模式

PHP设计模式汇总(2)—— PHP抽象工厂模式

PHP设计模式汇总(3)—— PHP单例模式

PHP设计模式汇总(4)—— PHP观察者模式

PHP设计模式汇总(5)—— PHP责任链模式

PHP设计模式汇总(6)—— PHP装饰器模式

(后续待更新)