装饰器模式和代理模式非常相似,都是用来增强原始类的功能,只不过代理类增加了是业务逻辑之外无关的的功能。
装饰器是在基础功能上的继续增强相关的功能。
我们通过一个一个画笔的设计,通过装饰器模式给画笔添加新功能
首先定义了一个抽象类
public abstract class Pen { public abstract void draw(); }
其次我们定义一个铅笔类
/** * 普通的铅笔 */ public class Pencil extends Pen{ @Override public void draw() { System.out.println("Pencil.draw()"); } }
单纯一个铅笔也画不好一幅画,如果能有多个彩色铅笔就更好了
/** * 给铅笔新增加了颜色功能 */ public class ColorDecorator extends Pen{ protected Pen pen; public ColorDecorator(Pen pen) { this.pen = pen; } @Override public void draw() { System.out.print("RedColor "); pen.draw(); } }
有颜色挺好,如果线条的粗细可以调整就更好了,那我们在给铅笔装饰一个线条粗细的功能
/** * 给铅笔新增了线条宽度的功能 */ public class WidthDecorator extends Pen{ protected Pen pen; public WidthDecorator(Pen pen) { this.pen = pen; } @Override public void draw() { System.out.print("Width "); pen.draw(); } }
OK,这下就可以开始画画了
public class Board { public static void main(String[] args) { Pencil pencil = new Pencil(); pencil.draw(); ColorDecorator colorDecorator = new ColorDecorator(pencil); colorDecorator.draw(); WidthDecorator widthDecorator = new WidthDecorator(colorDecorator); widthDecorator.draw(); } }
我们既可以使用普通的铅笔画画,也可以不断添加新的功能。
输出:
Pencil.draw()
RedColor Pencil.draw()
Width RedColor Pencil.draw()