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

    1.介绍:

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

    意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    何时使用:在不想增加很多子类的情况下扩展类。

    如何解决:将具体功能职责划分,同时继承装饰者模式。

    优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

    缺点:多层装饰比较复杂。

    使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

    2.案例:

    // 1. 抽象
    abstract class Beverage{
        public $_name;
        public abstract  function cost();
    }
    
    // 2. 被装饰者
    class Coffee extends Beverage{
        public function __construct(){
            $this->_name = 'Coffee';
        }
        public function cost(){
            return 1.00;
        }
    }
    
    // 3. 装饰器
    class CondimentDecorator extends Beverage{
        public function __construct(){
            $this->_name = 'Condiment';
        }
        public function cost(){
            return 0.1;
        }
    }
    // 
    class Milk extends CondimentDecorator{
        public $_beverage;
        public function __construct( $beverage ){
            $this->_name = 'Milk';
            if ($beverage instanceof Beverage ){
                $this->_beverage = $beverage;
            }
    
        }
        public function cost(){
            return $this->_beverage->cost()+0.2;
        }
    }
    
    class Sugar extends CondimentDecorator{
        public $_beverage;
        public function  __construct($beverage){
            $this->_name = 'Sugar';
            if ($beverage instanceof Beverage ){
                $this->_beverage = $beverage;
            }
        }
        public function cost(){
            return $this->_beverage->cost()+0.2;
        }
    }
    
    $coffee = new Coffee();
    
    $coffee = new Milk($coffee);
    
    $coffee = new Sugar($coffee);
    
    var_dump($coffee->cost());

    3.总结:

    装饰器的作用:遵循开闭原则,类的修改是闭合的,扩展是开发的;

              目的:给你个已经存在的类,动态的扩展新功能;

  • 相关阅读:
    【常见Web应用安全问题】13、Blind SQL/XPath injection
    【常见Web应用安全问题】14、Google Hacking
    【常见Web应用安全问题】14、Google Hacking
    更新和插入新纪录
    Webservice调用方式:axis,soap详解
    Webservice:客户端用https
    hdu 1711(KMP入门题)
    poj 3349(hash判重)
    poj 2486(树形DP+背包)
    zoj 1588(桥)
  • 原文地址:https://www.cnblogs.com/myvic/p/8080809.html
Copyright © 2011-2022 走看看