装饰模式

来源:互联网 发布:手机短信轰炸机软件 编辑:程序博客网 时间:2024/05/16 00:38

装饰模式顾名思义,就是添加一些额外的功能(装饰)。装饰是为了更加美观、更具艺术性,而基本的的操作不应该在装饰类中完成。装饰模式使得我们可以动态地为对象增加一些功能,而无需事先在类中定义。

装饰模式结构图如下:



下面是摘自《设计模式》的一个例子,稍微做了修改:


先给出类图:


下面是代码:

/** * @author Brandon B. Lin * */public abstract class VisualComponent {/* 绘制图形 */    public abstract void draw();    /* 调整大小 */    public abstract void reSize();    /* 最大化 */    public abstract void min();    /* 最小化 */    public abstract void max();}

/** * @author Brandon B. Lin * */public class TextView extends VisualComponent {@Overridepublic void draw() {out.println("Do draw!");}@Overridepublic void reSize() {out.println("Do reSize!");}@Overridepublic void min() {out.println("Do min!");}@Overridepublic void max() {out.println("Do max!");}}

/** * @author Brandon B. Lin * */public class VisualDecorator extends VisualComponent {protected VisualComponent component;// cnstructorpublic VisualDecorator(VisualComponent visualComponent) {this.component = visualComponent;// do something else}@Overridepublic void draw() {component.draw();}@Overridepublic void reSize() {component.reSize();}@Overridepublic void min() {component.min();}@Overridepublic void max() {component.max();}}

/** * @author Brandon B. Lin * */public class ScrollDecorator extends VisualDecorator {/** * @param visualComponent */public ScrollDecorator(VisualComponent visualComponent) {super(visualComponent);}@Overridepublic void draw() {component.draw();System.out.println("Add Scrollbar");}}

/** * @author Brandon B. Lin * */public class BorderDecorator extends VisualDecorator {/** * @param visualComponent */public BorderDecorator(VisualComponent visualComponent) {super(visualComponent);}@Overridepublic void draw() {component.draw();System.out.println("Add Border!");}}

/** * @author Brandon B. Lin * */public class DecoratorTest {/** * @param args */public static void main(String[] args) {new TextView().draw();out.println("-------------------------");// 創建一個帶滾動條的new ScrollDecorator(new TextView() ).draw();out.println("-------------------------");// 帶邊框new BorderDecorator(new TextView()).draw();out.println("-------------------------");//帶邊框又帶滾動條 第一種方式new BorderDecorator(new ScrollDecorator(new TextView())).draw();out.println("-------------------------");// 第二種方式new ScrollDecorator(new BorderDecorator(new TextView())).draw();}}

在Java API中,装饰模式最典型的例子是IO操作中的流。基本的读入输出操作在InputStream、OutputStream中定义,FilterInputStream是一个装饰类,其子类添加了诸如缓冲、数据类型转换、压缩、加密等额外功能,因此可以动态配置一个流的特性。



0 0
原创粉丝点击