设计模式06_装饰者模式

          本文是在学习中的总结,欢迎转载但请注明出处: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等是具体的装潢角色。

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

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 设计模式06_装饰者模式

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡