装饰器模式学习笔记

内容来自 - 《Laravel框架关键技术解析》

装饰器模式:是在开放-关闭原则下实现动态添加或减少功能的一种方式
Laravel在解析请求生成响应之前或之后需要经过中间件的处理,中间件就是使用装饰器模式实现的

简单的例子:

<?php

interface Decorator
{
    public function display();
}

class CharleyChan implements Decorator
{
    private $name;

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

    public function display()
    {
        echo "我是{$this->name},我出门了!!!" . PHP_EOL;
    }
}

class Finery extends CharleyChan
{
    private $component;

    public function __construct(Decorator $component)
    {
        $this->component = $component;
    }

    public function display()
    {
        $this->component->display();
    }

}

class Shoes extends Finery
{
    public function display()
    {
        echo "穿上鞋子" . PHP_EOL;
        parent::display();
    }
}

class Shorts extends Finery
{
    public function display()
    {
        echo "穿上短裤" . PHP_EOL;
        parent::display();
    }
}

class Fire extends Finery
{
    public function display()
    {
        echo "出门前先整理头发" . PHP_EOL;
        parent::display();
        echo "出门后再整理一下头发" . PHP_EOL;
    }
}

$charley = new CharleyChan('CharleyChan');
$shoes = new Shoes($charley);
$shorts = new Shorts($shoes);
$fire = new Fire($shorts);
$fire->display();

运行上面代码,输出:

出门前先整理头发

穿上短裤

穿上鞋子

我是CharleyChan,我出门了!!!

出门后再整理一下头发