IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PHP设计模式之装饰者模式

    mckee发表于 2015-05-10 21:36:28
    love 0

    定义:
    装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能。传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多。
    角色:
    Component(被装饰对象基类)
    ConcreteComponent(具体被装饰对象)
    Decorator(装饰者基类)
    ContreteDecorator(具体的装饰者类)
    示例代码:

    //被装饰者基类
    interface Component
    {
        public function operation();
    }
    
    //装饰者基类
    abstract class Decorator implements Component
    {
        protected $component;
    
        public function __construct(Component $component)
        {
            $this->component = $component;
        }
    
        public function operation()
        {
            $this->component->operation();
        }
    }
    
    //具体装饰者类
    class ConcreteComponent implements Component
    {
        public function operation()
        {
            echo 'do operation'.PHP_EOL;
        }
    }
    
    //具体装饰类A
    class ConcreteDecoratorA extends Decorator {
        public function __construct(Component $component) {
            parent::__construct($component);
    
        }
    
        public function operation() {
            parent::operation();
            $this->addedOperationA();   //  新增加的操作
        }
    
        public function addedOperationA() {
            echo 'Add Operation A '.PHP_EOL;
        }
    }
    
    //具体装饰类B
    class ConcreteDecoratorB extends Decorator {
        public function __construct(Component $component) {
            parent::__construct($component);
    
        }
    
        public function operation() {
            parent::operation();
            $this->addedOperationB();
        }
    
        public function addedOperationB() {
            echo 'Add Operation B '.PHP_EOL;
        }
    }
    
    
    class Client {
    
        public static function main() {
            /*
            do operation
            Add Operation A
            */
            $decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
            $decoratorA->operation();
    
    
            /*
            do operation
            Add Operation A 
            Add Operation B  
            */
            $decoratorB = new ConcreteDecoratorB($decoratorA);
            $decoratorB->operation();
        }
    
    }
    
    Client::main();



沪ICP备19023445号-2号
友情链接