国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > 设计模式06_装饰者模式

设计模式06_装饰者模式

来源:程序员人生   发布时间:2016-06-12 08:20:05 阅读次数:2337次

          本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51531519


1、定义

          动态将职责添加到对象身上。若要扩大功能,装潢者模式提供了比继承更加灵活的替换方案。(摘自Head First 中文版第91页)


2、说明

          通常情况下,在使用继承设计子类的行动,是在编译时静态决定的,所有的子类都会继承到相同的行动,这样会产生耦合较高。而利用组合来扩大对象的行动,就能够在运行时动态地进行扩大。装潢者模式是组合的1种表现,但是装潢者和被装潢者要有相同的超类。

         装潢者模式是针对抽象组件(Component)进行编程。如果要针对具体组件进行编程,需要重新思考利用架构,斟酌装潢者模式是不是适合。固然也能够改变Component接口,增加新的对象行动,实现“半透明”的装潢者模式,以便能够在实际项目中做出最好选择。


3、角色

         抽象构件角色(Component):给出1个抽象接口,以规范准备接收附加责任的对象。

         具体构件角色(Concrete Component):定义将要接收附加责任的类。

         装潢角色(Decorator):持有1个构件(Component)对象的援用,并定义1个与抽象构件接口1致的接口。

         具体装潢角色(Concrete Decorator):负责给构件对象“贴上”附加的责任


4、类图

这里写图片描述


5、示例

         抽象构件角色:Componet

package headfirst.design.decorator; public interface Componet { public void method(); }

         具体构件角色(待装潢者):ConcreateComponet

public class ConcreateComponet implements Componet { @Override public void method() { System.err.println("I am a method"); } }

         装潢角色:Decorator

package headfirst.design.decorator; public class Decorator implements Componet{ private Componet componet; public Decorator(Componet cp){ this.componet = cp; } @Override public void method() { componet.method(); } }

         具体装潢角色:ConcreateDecotator

package headfirst.design.decorator; public class ConcreateDecotator extends Decorator{ public ConcreateDecotator(Componet cp) { super(cp); } public void method(){ //可在之前添加方法 addmethodbefore(); super.method(); //可在以后添加方法 addmethodafter(); } private void addmethodafter() { System.err.println("add method after"); } private void addmethodbefore() { System.err.println("add method before"); } }

         测试:Test

package headfirst.design.decorator; public class Test { public static void main(String[] args) { Componet cp = new ConcreateComponet(); Decorator decorator = new ConcreateDecotator(cp); decorator.method(); } }

         运行结果:

add method before I am a method add method after

6、总结

         适用性:需扩大1个类的功能,附加额外的职责。可以动态给对象添加功能,也能够动态撤消。

         优点:Decorator模式与继承关系的目的都是要扩大对象的功能,但是Decorator可以提供比继承更多的灵活性。通过使用不同的具体装潢类和这些装潢类的排列组合,设计师可以创造出很多不同行动的组合。

         缺点:这类比继承更加灵活机动的特性,也同时意味着更加多的复杂性。装潢模式会致使设计中出现许多小类,如果过度使用,会使程序变得很复杂。

         JDK源码中也有很多地方用到了装潢者模式。java io就是其中比较典型的范例。例如,InputStream–>FilterInputStream–>BufferedInputStream;其中FilterInputStream是装潢角色,而BufferedInputStream等是具体的装潢角色。

         本文只是简单介绍装潢者模式,并未对其进行深入探讨,略显粗糙。希望本文对你有所帮助。

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生