PHP 设计模式之装饰器模式

11 篇文章 1 订阅

装饰器模式,使得在一个类不能完全满足需求时对其进行一些特定的自定义处理,而无需要新创建一个类

<?php

// 可以动态的添加修改类的功能



class Canvas
{
    public function init()
    {
        echo "init";
    }

    public function rect($top, $right, $bottom, $left)
    {
        echo $top, $right, $bottom, $left;
    }
}



// 目标,为 rect 方法增加一个输出标题

/** 传统方法
class Canvas2 extends Canvas
{
    public function rect($top, $right, $bottom, $left)
    {
        echo "++++", $top, $right, $bottom, $left;
    }
}

$canvas = new Canvas2();
$canvas->init();
$canvas->rect(3,5,6,7);
*/

// 装饰器模式


class Danvas implements IDrawDecorator
{

    private $decorators;

    public function init()
    {
        echo "init";
    }

    public function rect($top, $right, $bottom, $left)
    {
        $this->beforeDraw();
        echo $top, $right, $bottom, $left;
        $this->afterDraw();
    }

    public function beforeDraw()
    {
        $decorators = array_reverse($this->decorators);
        foreach ($decorators as $decorator) {
            $decorator->beforeDraw();
        }
    }

    public function afterDraw()
    {
        foreach ($this->decorators as $decorator) {
            $decorator->afterDraw();
        }
    }

    public function addDecorator(IDrawDecorator $decorator)
    {
        $this->decorators[] = $decorator;
    }
}


interface IDrawDecorator
{
    public function beforeDraw();
    public function afterDraw();
}

abstract class ADrawDecorator
{
    public abstract function beforeDraw();
    public abstract function afterDraw();
}


class ColorDrawDecorator extends ADrawDecorator
{
    public function beforeDraw()
    {
        echo "color before \n";
    }
}

class SizeDrawDecorator extends ADrawDecorator
{
    public function beforeDraw()
    {
        echo "size before \n";
    }

    public function afterDraw()
    {
        echo "size after \n";
    }
}


$canvas = new Danvas;
$canvas->init();


$canvas->addDecorator(new ColorDrawDecorator);
$canvas->addDecorator(new SizeDrawDecorator);

$canvas->rect(4,6,7,8);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值