《设计模式 - 装饰器模式》

一:什么是装饰器模式?

  动态地给一个对象附加额外职责。装饰者为功能的扩展提供了一个比使用子类继承更加灵活的选择

  - 简单来说,就是我们可以动态的对一个对象,进行一些增加/删除功能,让其可以灵活的实现需求。

 

二:为什么要用装饰器模式?

  - 还是拿昨天的商场打折的事,接着举例子。2018/10/26《大话设计模式》【策略模式】

  - 在商场打折中,我们已经定义好了一些策略,但是天有不测风云,如果我并不想让这些策略单独的运行。

  - 也就是说,我希望如果用户满1K之后,先打八折,在减100,这种不断添加的新算法上,我们昨天的就不适用了。

  - 这时,也就用到了装饰器模式,在此模式中,商品价格就是一个装饰的对象,需要我们装饰合适的需求上去。

  

三:装饰器模式的优缺点?

  - 优点

    - 可以动态的扩展关系。

    - 修饰器和被装饰者解耦,互相不关联

  - 缺点

    - 内部继承关系比较复杂

 

四:装饰器模式结构图?

  - 

 

五:实现装饰器模式?

<?php
// Decorator 装饰器模式
/* 
 * 计算金额装饰器
 * Interface Decorator
 */
interface Decorator
{
    public function Compute();
}
 
/**
 * 待装饰初始金额
 * Class ConcreteDecorator
 */
class CreateDecorator implements Decorator
{
    public $money;
 
    public function __construct($money)
    {
        $this->money = $money;
    }
 
    public function Compute()
    {
    }
}
 
/**
 * 不同计算金额方式 - 装饰器父类
 * Class Clothes
 */
class Money implements Decorator
{
    protected $decorator;
 
    function Decorate($decorator)
    {
        $this->decorator = $decorator;
    }
 
    function Compute()
    {
        if(!empty($this->decorator))
        {
            $this->decorator->Compute();
        }
    }
 
}
//------------------------------具体装饰器----------------

// 打八折装饰器
class A extends Money
{
    function Compute()
    {
        $this->decorator->money *= 0.8;
    }
}
 
// 满500 - 100 装饰器
class B extends Money
{
    function Compute()
    {
        if ($this->decorator->money > 500) {
            $this->decorator->money -= 100;
        }
    }
}
//------------------------装饰器模式测试代码------------------
// 计算初始金额
$Money = new CreateDecorator(1000);

// 先满减
$A = new A();

// 在打八折
$B = new B();

// 打折装饰器
$A->Decorate($Money);
$A->Compute();

// 满减装饰器
$B->Decorate($Money);
$B->Compute();

var_dump($Money);

  github: https://github.com/papapalh/Php-Practice/blob/master/Design%20pattern/2_Decorator.php

 

posted @ 2018-10-27 14:26  Zzz哈  Views(117)  Comments(0Edit  收藏  举报