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.总结:

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

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

  • 相关阅读:
    手机APP测试环境搭建---appium
    Python实现H5页面
    Git的基础学习
    python UI自动化测试
    python selenium常用基本方法---H5和键盘鼠标操作
    python基础方法
    ResultSetMetaData和DatabaseMetaData实现数据库中属性,属性值,属性所赋值的获取等
    DAO模型设计实现数据的 增,删,改,查方法
    利用反射及jdbc元数据实现通用的查询方法
    PreparedStatement接口及其方法的使用
  • 原文地址:https://www.cnblogs.com/myvic/p/8080809.html
Copyright © 2011-2022 走看看