装饰者模式(Decorator Pattern) ,当一个对象在使用的过程中可能更换或者增加包装,就像汉堡一样,可能搞一些不同的活动而更换包装袋,但是不需要修改汉堡。这时候只需要印刷新的包装盒并更换包装盒就能完美适配新的需求,而不需要修改其他的东西。在程序的角度来说,这些需要改动的部分可能写在配置文件上,在设计的角度上,对修改封闭,但是对拓展开放,从而使得程序不会由于修改原来的代码而导致新的问题出现。
定义一个接口具备画图形的功能
public interface Shape { public void draw(); }
定义一个实现类,这个实现类可以画圆形
public class Circle implements Shape{ @Override public void draw() { System.out.println("I'm circle"); } }
包装类,对圆形进行包装,并增加了颜色
public class DecoraterShape implements Shape{ private Shape decoratedShap; public DecoraterShape(Shape decoratedShap) { this.decoratedShap = decoratedShap; } @Override public void draw() { decoratedShap.draw(); drawExtraColor(); } public void drawExtraColor(){ System.out.println("Drawing extra color to the shape!"); } }
运行类
public class DecoraterPattern { public static void main(String[] args){ Shape circle = new Circle(); Shape shape = new DecoraterShape(circle); combireCircleGroup(shape); } public static void combireCircleGroup(Shape shape){ shape.draw(); } }
可能会有一个疑问,为什么包装类需要实现生成图形的接口,这其实是一个精髓的地方,看上面的运行类,装饰之后的对象仍然能够像没有经过装饰一样,传入到之前使用这个对象的地方,可以说是无缝插入,也就是说,装饰后的对象跟装饰前一样使用,根本不需要切换对象。