标签:设计模式 装饰模式
<?php /** * 2.3 装饰模式 * 定义: * 动态的给一个对象添加一些额外的职责 * ,就增加功能来说,装饰模式比生成子 * 类更灵活。 * 角色: * 1. 抽象组件角色 * 职责:给出一个抽象接口,以规范 * 准备接受附加责任的对象。 * 2. 具体组件角色 * 职责:定义一个将要接收附加责任 * 的类。 * 3. 装饰角色: * 职责:持有一个构件对象的实例, * 并实现一个与抽象组件接口 * 一致的接口。 * 4. 具体装饰角色 * 职责:复制给构件对象添加上附加 * 的责任。 * 优点: * 1. 此模式与继承关系的目的都是要扩展 * 对象的功能,但是此模式可以提供比 * 继承更多的灵活性。 * 2. 通过使用不同的具体装饰类以及这些 * 装饰类的排列组合,设计师可以造出 * 很多不同行为的组合。 * 缺点: * 1. 这种比较继承更加灵活机动的特性, * 也同时意味着更加多的复杂性。 * 2. 装饰模式会导致设计中出现许多小类, * 如果过度使用,会使程序变的很复杂。 * 3. 装饰模式是针对抽象构件类型编程。但 * 是,如果你要针对具体组件编程时,就 * 应该重新思考你的应用架构,以及装饰 * 者是否合适。当然也可以改变构件接口 * ,增加新的公开的行为,实现"变透明" * 的装饰者模式。在实际项目中要做出最 * 佳选择。 * 使用场景: * 1. 在不影响其他对象的情况下,以动态、透 * 明的方式给单个对象添加职责。 * 2.处理那些可以撤销的职责。 * 3. 当不能采用生成子类的方式进行扩充时。 * 一种情况是,可能有大量独立的扩展,为 * 支持每一种组合将产生大量的子类,使得 * 子类数目成爆炸性增长。另一种情况可能 * 是以为定义被隐藏,或类定义不能生成子 * 类。 */ header(‘content-type:text/html;charset=utf-8‘); //具体组件类 class Person { public $name; public function __construct($name){ $this->name=$name; } public function show(){ echo ‘装扮的‘.$this->name; } } //装饰器类 class Finery extends Person{ public $person; public function __construct(Person $person){ $this->person=$person; } public function show(){ $this->person->show(); } } //具体装饰器类 class TShirts extends Finery{ public function show(){ echo ‘大T恤 ‘; parent::show(); } } class BigTrouser extends Finery{ public function show(){ echo ‘裤子 ‘; parent::show(); } } //客户端 $p1=new Person(‘张三‘); $ts1=new TShirts($p1); $bt1=new BigTrouser($p1); $tsbs1=new TShirts(new BigTrouser($p1)); $ts1->show(); echo ‘<br/>‘; $bt1->show(); echo ‘<br/>‘; $tsbs1->show(); ?>
本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614776
标签:设计模式 装饰模式
原文地址:http://noican.blog.51cto.com/4081966/1614776