设计模式-装饰模式

装饰模式 Decorator Pattern: (结构型模式)
动态的给一个对象增加一些额外的职责。
在不改变原类和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,
也就是装饰包裹真实的对象。所以人们有啥也称它为包装器 Wrapper, 与适配器模式别名相同,
它们使用的场合不同。

我们常用的给一个类增加行为方法:
1、继承机制,使用继承机制给类增加功能
2、关联机制:即是将一个类的对象嵌入到另外一个对象中,然后用这个对象调用它自己的一些行文。

那为啥子还有装饰器模式呢?
因为装饰器模式比继承生成子类更加灵活,可以动态的增加功能,也可以动态撤销功能。


装饰模式包含如下角色:
Component: 抽象组件:定义一个对象接口,以规范准备接受附加责任的对象,即可给这些对象动态添加职责
ConcreteComponent 具体组件角色:被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。
Decorator 抽象装饰类: 维持一个指向组件对象的实例,并定义一个与抽象组件角色接口一致的几口
ConcreteDecorator 具体装饰类: 向组件添加角色。

示例:

<?php
//https://blog.csdn.net/jhq0113/article/details/45458133
//对象接口
interface IComponent
{
    function Display();
}


//待装饰对象
class Person implements IComponent
{
    private $name;

    function __construct($name) {
        $this->name = $name;
    }

    function Display() {
        echo "装扮: ".$this->name." \r\n";
    }
}

//装饰器父类
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 "Txue ";
        parent::Display();
    }
}

class WaiTao extends Clothes
{
    function Display() {
        echo "外套 ";
        parent::Display();
    }
}

$YaoMing = new Person("姚明");
$pixie = new PiXie();
$WaiTao = new WaiTao();

$pixie->Decorate($YaoMing);
$WaiTao->Decorate($pixie);
$WaiTao->Display();

 

posted @ 2017-05-25 22:31  九卷  阅读(195)  评论(0编辑  收藏  举报