标签:设计模式 装饰模式
<?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