找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1378|回复: 0
打印 上一主题 下一主题

学习php设计模式 php实现装饰器模式(decorator)

[复制链接]

2500

主题

2513

帖子

7520

积分

论坛元老

Rank: 8Rank: 8

积分
7520
跳转到指定楼层
楼主
发表于 2018-2-14 05:41:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活【GOF95】
装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责。这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。
一、装饰模式结构图



二、装饰模式中主要角色
抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责。
具体构件(Concrete Component)角色:定义一个将要接收附加职责的类。
装饰(Decorator)角色:持有一个指向Component对象的指针,并定义一个与Component接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象增加附加的职责。
三、装饰模式的优缺点
装饰模式的优点:
1、比静态继承更灵活;
2、避免在层次结构高层的类有太多的特征
装饰模式的缺点:
1、使用装饰模式会产生比使用继承关系更多的对象。并且这些对象看上去都很想像,从而使得查错变得困难。
四、装饰模式适用场景
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤消的职责,即需要动态的给一个对象添加功能并且这些功能是可以动态的撤消的。
3、当不能彩生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
五、装饰模式PHP示例

_component = $component;
}

public function operation() {
  $this->_component->operation();
}
}

/**
* 具体装饰类A
*/
class ConcreteDecoratorA extends Decorator {
public function __construct(Component $component) {
  parent::__construct($component);

}

public function operation() {
  parent:peration(); // 调用装饰类的操作
  $this->addedOperationA(); // 新增加的操作
}

/**
  * 新增加的操作A,即装饰上的功能
  */
public function addedOperationA() {
  echo 'Add Operation A
';
}
}

/**
* 具体装饰类B
*/
class ConcreteDecoratorB extends Decorator {
public function __construct(Component $component) {
  parent::__construct($component);

}

public function operation() {
  parent:peration();
  $this->addedOperationB();
}

/**
  * 新增加的操作B,即装饰上的功能
  */
public function addedOperationB() {
  echo 'Add Operation B
';
}
}

/**
* 具体构件
*/
class ConcreteComponent implements Component{

public function operation() {
  echo 'Concrete Component operation
';
}

}

/**
* 客户端
*/
class Client {

  /**
  * Main program.
  */
public static function main() {
  $component = new ConcreteComponent();
  $decoratorA = new ConcreteDecoratorA($component);
  $decoratorB = new ConcreteDecoratorB($decoratorA);

  $decoratorA->operation();
  $decoratorB->operation();
}

}

Client::main();
?>
以上就是使用php实现装饰模式的代码,还有一些关于装饰模式的概念区分,希望对大家的学习有所帮助。
            
            
您可能感兴趣的文章:
  • PHP简单装饰器模式实现与用法示例
  • PHP、Python和Javascript的装饰器模式对比
  • PHP设计模式之注册树模式分析
  • PHP设计模式之工厂模式详解
  • php简单实现单态设计模式的方法分析
  • 轻松掌握php设计模式之访问者模式
  • PHP常用的三种设计模式汇总
  • PHP设计模式之迭代器模式
  • PHP设计模式之观察者模式实例
  • php设计模式之委托模式
  • PHP常用设计模式之委托设计模式
  • PHP设计模式之装饰器模式实例详解
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端