zoukankan      html  css  js  c++  java
  • php 八大设计模式-装饰器模式

    定义:

    装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

    适用场景:

    1. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
    2. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
    3. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
    // 接口
    interface IComponent {
        function Display();
    }
    
    
    // 
    class Person implements IComponent {
    
        private $name;
     
        public function __construct($name) {
            $this->name=$name;
        }
     
        public function Display() {
            echo "装扮的:{$this->name}<br/>";
        }
    
    }
    
    
    class Clothes implements IComponent {
        protected $component;
     
        public function Decorate(IComponent $component) {
            $this->component = $component;
        }
     
        public function Display() {
            if(!empty($this->component)) {
                $this->component->Display();
            }
        }
     
    }
    
    
    class PiXie extends Clothes {
        public function Display() {
            echo "皮鞋  ";
            parent::Display();
        }
    }
    
    class QiuXie extends Clothes {
        public function Display() {
            echo "球鞋  ";
            parent::Display();
        }
    }
    
    class Tshirt extends Clothes {
        public function Display() {
            echo "T恤  ";
            parent::Display();
        }
    }
    
    
    class Waitao extends Clothes {
        public function Display() {
            echo "外套  ";
            parent::Display();
        }
    }

    客户端运行

    $Yaoming=new Person("姚明");
    $aTai=new Person("A泰斯特");
     
    $pixie=new PiXie();
    $waitao=new Waitao();
     
    $pixie->Decorate($Yaoming);
    $waitao->Decorate($pixie);
    $waitao->Display();
     
    echo "<hr/>";
     
    $qiuxie=new QiuXie();
    $tshirt=new Tshirt();
     
    $qiuxie->Decorate($aTai);
    $tshirt->Decorate($qiuxie);
    $tshirt->Display();
  • 相关阅读:
    18.中介者模式
    17.迭代器模式
    16.解释器模式
    15.命令模式
    Git超详细用法,通俗易懂
    CSS Sprites精灵图(雪碧图)
    小程序被冻结,忘记原始ID,如何找回?
    vue组件-视频播放之video.js
    基础设计模式-04 复杂对象创建的建造器模式
    基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
  • 原文地址:https://www.cnblogs.com/fangdada/p/14878994.html
Copyright © 2011-2022 走看看