常用设计模式总结—装饰模式
在平时的编程过程中,我们可能会经常遇到这样一种情况,代码的输出是将输入层层包装以后来得到的。就好比我们装修的时候砌墙一样,先是刮水泥、然后是涂腻子,最近刷油漆,经过以上的步骤,我们就能够得到一面干净的墙了。
在开发桌面应用程序的时候,会比较多的碰到这种情况,理论上你只需要一个展示区域,但是为了展示的好看,你可能需要给你的边框。为了功能的实用,你可能会加上滚动条。这些都可以用装饰模式来搞定。
装饰模式适用的场景:
1) 在不影响其它对像的情况下,动态、透明的给这个对象添加职责
2) 处理那些可以撤销的职责
优缺点
1) 比静态继承更加灵活,decorator提供了一种更加灵活的往对象添加职责的方式。
2) 避免在继承结构的上层定义太多的特征。Decrorator采用一种“即用即付”的方式添加职责,它并不采一种复杂的可定制的类中支持所有可预见的特征。相反,你可以定义一些简单的类,用这些简单的类“堆砌”成最终的功能。
3) Decorator最大的缺点就是声明对象的过程中会产生很多小的对象。
来看源代码吧
1) VisualComponent.java
package zl.study.designpattern.decorator; public interface VisualComponent { public void draw(); }2)TextView.java
package zl.study.designpattern.decorator; public class TextView implements VisualComponent{ private String text; public TextView(String text){ this.text = text; } @Override public void draw() { System.out.println(text); } }3)Decorator.java
package zl.study.designpattern.decorator; public class Decorator implements VisualComponent { public Decorator(VisualComponent component ){ this.component= component; } @Override public void draw() { component.draw(); } private VisualComponent component; }4) BorderDecorator.java
package zl.study.designpattern.decorator; public class BorderDecorator extends Decorator{ private int width; public BorderDecorator(VisualComponent component,int width) { super(component); this.width = width; } @Override public void draw() { super.draw(); drawBorder(); } private void drawBorder(){ System.out.print("|"+ width); } }5)ScrollDecorator.java
package zl.study.designpattern.decorator; public class ScrollDecorator extends Decorator{ public ScrollDecorator(VisualComponent component) { super(component); } @Override public void draw() { drawScroll(); super.draw(); } private void drawScroll(){ System.out.println("scroll"); } }
DecoratorTest.java
package zl.study.designpattern.decorator.test; import zl.study.designpattern.decorator.BorderDecorator; import zl.study.designpattern.decorator.ScrollDecorator; import zl.study.designpattern.decorator.TextView; import zl.study.designpattern.decorator.VisualComponent; public class DecoratorTest { public static void main(String args[]){ VisualComponent component = new ScrollDecorator( new BorderDecorator( new TextView("hello World!"),10 ) ); component.draw(); } }