• php实现设计模式之 装饰模式


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

    装饰模式是一种 结构型模式

    主要角色 :

    (1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
    (2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
    (3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
    (4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

    uml类图如下所示:

    下面是php实现的一个实例:

    <?php 
    /*
     * 装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
     * 
     * 角色
     * 抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。
     * 具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。 
     * 装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
     * 具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。
     */
    
    //1抽象构件角色
    abstract class drink{
    	abstract function showprice();
    }
    
    
    //具体构件角色
    class coffee extends drink{
    	public $name = '咖啡';
    	public $price = '10';
    	public function showprice(){
    		echo $this->name.'   ';
    		echo $this->price.'元';
    	}
    }
    
    //生成对象。
    $coffee = new coffee();
    //$coffee->showprice();
    
    
    
    
    
    //上面我已经生成了一个对象,现在已经在线上运行
    //但是我想动态的为coffee对象添加功能,而不改变原有的类和继承关系,怎么办?
    //装饰模式
    
    
    
    
    
    //装饰角色
    class decretor extends drink{
    	public $drink;
    	public function __construct(drink $drink){//包装了对象哦
    		$this->drink = $drink;
    	}
    	
    	public function showprice(){//实现对象原有功能,
    		$this->drink->showprice();
    		$this->add();//新增功能
    	}
    	public function add(){
    		
    	}
    }
    
    //具体装饰角色
    class suger extends decretor{
    	public $price = 1.5;
    	public $name = '加糖';
    	public function add(){
    		echo $this->name.'   '.$this->price;
    		echo '  一共'.($this->drink->price+$this->price).'元';
    	}
    }
    
    $suger = new suger($coffee);
    $suger->showprice();
    ?>
    

      

  • 相关阅读:
    dirname,basename的用法与用途
    终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
    linux-manjaro下添加Yahei Hybrid Consola字体
    Idea无法调出搜狗等中文输入法
    Spring 源码学习系列
    BF算法
    Mybatis Mapper接口是如何找到实现类的-源码分析
    Lua脚本在redis分布式锁场景的运用
    GO语言一行代码实现反向代理
    SpringMVC源码分析-400异常处理流程及解决方法
  • 原文地址:https://www.cnblogs.com/taijun/p/4048446.html
Copyright © 2020-2023  润新知