• 《设计模式


    一:什么是装饰器模式?

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

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

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

      - 还是拿昨天的商场打折的事,接着举例子。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

  • 相关阅读:
    PostgreSQL杂记页
    程序员给女朋友周年纪念的浪漫
    实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
    XAOP的使用示范例子
    XPage的使用示范例子
    Python手势识别与控制
    Python人体肤色检测
    基于Opencv自带BP网络的车标简易识别
    iOS 自定义转场动画
    Python实时语音识别控制
  • 原文地址:https://www.cnblogs.com/25-lH/p/9861084.html
Copyright © 2020-2023  润新知