• 装饰器模式


    <?php
    class baseart{
        public $content;
        protected $art = null;
        public function __construct($content){
            $this->content = $content;
        }
        public function decorator(){
            return $this->content;
        }
    }
    
    //编辑文章
    class bianart extends baseart{
        public function __construct(baseart $art){
            $this->art = $art;
        }
        public function decorator(){
            return $this->content = $this->art->decorator()."--小编摘要--";
        }
    }
    
    //编辑文章
    class seoart extends baseart{
        public function __construct(baseart $art){
            $this->art = $art;
        }
        public function decorator(){
            return $this->content = "--seo--".$this->art->decorator();
        }
    }
    
    $b = new seoart(new bianart(new baseart("天天向上")));
    echo $b->decorator();
    

      

    另外一个例子:

    <?php
    
    /**
     * Class Component
     * Component抽象类, 可以给这些对象动态的添加职责
     */
    abstract class Component
    {
        abstract public function operation();
    }
    
    
    /**
     * Component的实现类
     * Class ConcreteComponent
     */
    class ConcreteComponent extends Component
    {
        public function operation()
        {
            echo __CLASS__ .  '|' . __METHOD__ . "
    ";
        }
    }
    
    
    /**
     * Class Decorator
     * 装饰器的抽象类,维持一个指向组件对象的接口对象, 并定义一个与组件接口一致的接口
     */
    abstract class Decorator extends Component
    {
        /**
         * 持有Component的对象
         */
        protected $component;
    
        /**
         * 构造方法传入
         */
        public function __construct(Component $component)
        {
            $this->component = $component;
        }
    
        abstract public function operation();
    }
    
    /**
     * Class ConcreteDecoratorA
     * 装饰器的具体实现类,向组件对象添加职责,beforeOperation(),afterOperation()为前后添加的职责。
     */
    class ConcreteDecoratorA extends Decorator
    {
        //在调用父类的operation方法的前置操作
        public function beforeOperation()
        {
            echo __CLASS__ . '|' . __METHOD__ . "
    ";
        }
    
        //在调用父类的operation方法的后置操作
        public function afterOperation()
        {
            echo __CLASS__ . '|' . __METHOD__ . "
    ";
        }
    
        public function operation()
        {
            $this->beforeOperation();
            $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能
            $this->afterOperation();
        }
    }
    
    class ConcreteDecoratorB extends Decorator
    {
        //在调用父类的operation方法的前置操作
        public function beforeOperation()
        {
            echo __CLASS__ . '|' . __METHOD__ . "
    ";
        }
    
        //在调用父类的operation方法的后置操作
        public function afterOperation()
        {
            echo __CLASS__ . '|' . __METHOD__ . "
    ";
        }
    
        public function operation()
        {
            $this->beforeOperation();
            $this->component->operation();//这里可以选择性的调用父类的方法,如果不调用则相当于完全改写了方法,实现了新的功能
            $this->afterOperation();
        }
    }
    
    //客户端使用装饰器
    $component = new ConcreteComponent();
    $decoratorA = new ConcreteDecoratorA($component);
    $decoratorB = new ConcreteDecoratorB($decoratorA);
    $decoratorB->operation();
    ConcreteDecoratorB|ConcreteDecoratorB::beforeOperation
    ConcreteDecoratorA|ConcreteDecoratorA::beforeOperation
    ConcreteComponent|ConcreteComponent::operation
    ConcreteDecoratorA|ConcreteDecoratorA::afterOperation
    ConcreteDecoratorB|ConcreteDecoratorB::afterOperation
    

      

  • 相关阅读:
    基础数据类型
    python2x与python3x区别(30个)更新中。。。
    注释
    常量
    变量
    十、SpringCloud config分布式配置中心
    九、Gateway新一代网关
    八、Hystrix断路器(下)
    八、Hystrix断路器(上)
    七、OpenFeign服务接口调用
  • 原文地址:https://www.cnblogs.com/sunlong88/p/8691474.html
Copyright © 2020-2023  润新知