动态地给对象添加一些额外的职责。就添加函数而言,Decorator模式比生成子类更灵活。[GOF95]装饰器模式以对客户透明的方式将更多的责任动态地附加到对象上。也就是说,客户在装修前后并没有感觉到对象的不同。装饰模式可以扩展对象的功能,而不需要创建更多的子类。一、装饰器模式结构图。
第二,装饰器模式中的主要角色抽象组件角色:定义一个对象接口来标准化准备接收额外职责的对象,这样职责就可以动态地添加到这些对象中。具体组件的作用:定义一个将接受额外责任的类。装饰者角色:持有指向组件对象的指针,并定义与组件接口一致的接口。混凝土装饰者角色:负责向组件对象添加额外的职责。3.装饰器模式的优缺点装饰器模式的优点:1。比静态继承更灵活;2.避免层次结构顶部的类有太多功能装饰器模式的缺点:1。使用装饰器模式会比使用继承关系产生更多的对象。而且这些物件看起来都很有想象力,很难检查错误。四.装饰模式1的适用场景。以动态透明的方式向单个对象添加责任,而不影响其他对象。2.处理那些可以撤销的职责,也就是说,需要动态的给一个对象添加函数,这些函数可以动态撤销。3.当生成子类的方法无法扩展时。在一种情况下,可能会有大量的独立扩展,并且会生成大量的子类来支持每种组合,这使得子类的数量激增。另一种情况可能是因为类定义是隐藏的,或者类定义不能用于生成子类。装饰器模式的PHP示例。
?Php/** *抽象组件角色*/接口组件{/** *示例方法*/公共函数操作();}/* * *装饰角色*/抽象类装饰器实现组件{ protected $ _ component公共函数_ _ construct(Component $ Component){ $ this-_ Component=$ Component;} public function operation(){ $ this-_ component-operation();}}/* * *混凝土装饰类a */class混凝土装饰器扩展装饰器{ public function _ _ construct(component $ component){ parent :3360 _ _ construct($ component);} public function operation(){ parent : operation();//调用装饰类操作$ this-addedOperationA();//新操作}/* * *新操作a,即装饰功能*/公共功能addedoperationa(){ echo ' add operation a br/';}}/* * *混凝土装饰类b */class混凝土装饰器b扩展装饰器{ public function _ _ construct(component $ component){ parent :3360 _ _ construct($ component);} public function operation(){ parent : operation();$ this-addedOperationB();}/* * *新增操作b,即装饰功能*/公共功能addedoperationb(){ echo ' add operation b br/';}}/* * *混凝土组件*/class混凝土组件实现组件{ public function operation(){ echo ' concrete component operation br/';}}/* * *客户端*/classclient {/* * *主程序。*/public static function main(){ $ component=new concrete component();$ decoratorA=新混凝土Decorora($ component);$ decoratorB=新混凝土Departorb($ Departora);$ Decorora-operation();$ DepartOrb-operation();} } client :3360 main();以上就是用php实现装饰器模式的代码,关于装饰器模式有一些概念上的区别,希望对大家的学习有所帮助。