一、什么是装饰模式
通过关联机制给类增加行为,其行为的扩展由修饰对象来决定;
如JAVA IO流里的以下形式,BufferedReader为装饰类,其关联了一个具体对象(new FileReader(new File("test.txt"))),并对其进行装饰,装饰后拥有readLine行为(方法):
new BufferedReader(new FileReader(new File("test.txt")));
二、补充说明
与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象;
或者说,继承是对类进行扩展,装饰模式是对对象进行扩展;
三、角色
抽象构件
具体构件
抽象装饰类
具体装饰类
说明:具体构件、抽象装饰类、具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件;
四、例子
例子说明:
画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画;
PaintBeginner实现Painter接口,为具体构件;
PainterDecorator实现Painter接口,为抽象装饰类,其内部关联一个Painter对象,通过构造函数获取;
HillPainterDecorator、RiverPainterDecorator、TreePainterDecorator为具体装饰类,表明被装饰的画家能够绘画Hill、River、Tree;
类图:
代码实现:
Painter.java
package com.pichen.dp.decorator; public interface Painter { public abstract String getDescription(); public abstract String painting(); }