1.介绍装饰器模式,顾名思义,就是给一个类添加功能,起到装饰作用。我们都知道,如果要给某个类增加功能,又要避免在原有类上修改代码,最常见的方式是增加一个新的类来继承目标类,但是如果增加的多了,类会爆炸式增长的模式给管理带来巨大的麻烦,而装饰者模式更好的解决了这个问题。从设计的角度来看,装饰者模式涉及四个角色:被装饰类:要扩展的源类;装饰器类:通过该类可以为被装饰类动态添加额外的方法,多为抽象类;具体装饰类:该类实现了自装饰器类,完成了完整的算法;客户端角色:客户端类提出使用特定类的请求;今天就让我们一起来看看深入了解装饰师的玩法吧!2、代码示例如下以一件衣服的制作为例。一块布料裁好后,衣服可以做的很好,但是这样的衣服卖不出去,没有美感,所以我们需要一些装饰,让衣服好看。我们先创建一个抽象类或接口,定义一个骨架,如下:/***创建一个基本骨架*/publicinterfaceClothes{voidmakeClothes();}然后创建一个我们需要装饰的源类,如下:/***就是装饰类*/publicclassMakeClothesimplementsClothes{@OverridepublicvoidmakeClothes(){System.out.println("制作一件衣服");}}然后创建我们的主角,装饰类,如下:/***装饰类*/publicclassDecoratorimplementsClothes{privateClothesclothes;publicDecorator(Clothesclothes){this.clothes=clothes;}@OverridepublicvoidmakeClothes(){clothes.makeClothes();}}最后创建两个具体的装饰类,如下:/***具体装饰类*/publicclassEmbrideeryDecoratorextendsDecorator{publicEmbroideryDecorator(Clothesclothes){super(clothes);}@OverridepublicvoidmakeClothes(){super.makeClothes();System.out.println("给衣服绣花");}}/***具体装饰类*/publicclassMickeyDecoratorextendsDecorator{publicMickeyDecorator(Clothesclothes){super(clothes);}@OverridepublicvoidmakeClothes(){super.makeClothes();System.out.println("给衣服画米老鼠图案");}}怎么用呢?请看下面的测试类:/***Client*/publicclassDecorateClient{publicstaticvoidmain(String[]args){Clothesclothes=newMakeClothes();clothes=newEmbroideryDecorator(clothes);//刺绣clothes=newMickeyDecorator(clothes);//给衣服添加米老鼠图案clothes.makeClothes();System.out.println("成品已完成!");}}输出结果如下:做一件衣服,在衣服上绣花,在衣服上画米老鼠图案,成品完成,做一件衣服,在衣服上绣花,和在衣服上绘制米老鼠图案,成品完成从结果可以看到,我们成功的在MakeClothes类中动态添加了两个方法,一个是给衣服绣花,一个是给衣服添加米老鼠图案,以及终于完成成品啦!可见装饰效果还不错~3.应用其实在jdk中,装饰器设计模式也有很多典型的场景应用。比如我们熟悉的io包中的字节输入输出流就使用了装饰器设计模式!其中FilterInputStream和FilterOutputStream是装饰类,用于动态提供输入输出。流量增加法!4.总结巧妙地采用装饰器模式可以解决类继承过多的问题,使代码清晰可读。但是,如果装饰的层数过多,也会影响代码的可维护性。所以,在实际使用的过程中,需要灵活运用!
