PHP设计模式之装饰模式

以下文字部分均为本人自己的想法与总结所以未必正确;

代码摘自https://blog.csdn.net/rust94/article/details/88895465

 装饰模式:

    概念: 装饰模式(又称包装模式)就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。

 角色:

       抽象产品类

       具体产品类

       抽象装饰类

       具体装饰类
 

  个人理解:

          打个比方说,如果是继承的话就是就是大箱子(父类)里面套个小箱子(子类),而装饰模式则不是继承而是‘组合’,是给原来的大箱子外面加个装饰。

          装饰模式能动态的给一个产品添加一些额外的“装饰”(也就是新的功能),就增加功能来说,装饰模式比生成子类更为灵活。 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现。

<?php

abstract class Component
{
    abstract public function Operation();
}

/**
* ConcreteComponent
*/
class ConcreteComponent extends Component
{
    public function Operation()
    {
        echo "具体对象的操作.\n";
    }
}

abstract class Decorator extends Component
{
    protected $component;

    // 设置component
    public function SetComponent($component)
    {
        $this->component = $component;
    }

    // 重写Operation(),实际执行的是component的Operation方法
    public function Operation()
    {
        if ($this->component != null)
        {
            $this->component->Operation();
        }
    }
}

/**
* ConcreteDecoratorA
*/
class ConcreteDecoratorA extends Decorator
{
    // 本类的独有功能,以区别于ConcreteDecoratorB
    private $addedState;

    public function Operation()
    {   
        // 首先运行原Component的Operation(),再执行本类的功能,
        // 如addedState,相当于对原Component进行了装饰
        parent::Operation();
        $this->addedState = "ConcreteDecoratorA Status";
        echo $this->addedState."\n";
        echo "具体装饰对象A的操作.\n";
    }
}


/**
* ConcreteDecoratorB
*/
class ConcreteDecoratorB extends Decorator
{
    public function Operation()
    {   
        // 首先运行原Component的Operation(),再执行本类的功能,
        // 如addedBehavior,相当于对原Component进行了装饰
        parent::Operation();
        $this->addedBehavior();
        echo "具体装饰对象B的操作.\n";
    }

    // 本类的独有功能,以区别于ConcreteDecoratorA
    private function addedBehavior()
    {
        echo "ConcreteDecoratorB Status.\n";
    }
}

// 客户端代码
// 装饰的方法是:首先用ConcreteComponent实例化对象c,
// 然后用ConcreteDecoratorA的实例对象$di来包装$c,
// 然后再用ConcreteDecoratorB的实例$d2包装$d1,
// 最终执行$d2的Operation(); 
$c = new ConcreteComponent();
$d1 = new ConcreteDecoratorA();
$d2 = new ConcreteDecoratorB();

$d1->SetComponent($c);
$d2->SetComponent($d1);
$d2->Operation();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值