假如有一块蛋糕,如果只涂奶油,其他什么都不加,就是奶油蛋糕。加上草莓,就是草莓奶油蛋糕。如果再加巧克力,再用白色巧克力写上姓名,插上代表年龄的蜡烛,就成了生日蛋糕。
像这样不断为对象添加装饰的设计模式被称为装饰器模式。
类图:
Display
类是可以显示多行字符串的抽象类。StringDisplay
继承了Display
,用于显示单行字符串,相当于核心蛋糕。
Border
类也是Display
的子类,代表装饰的边框。其中有一个Display
的实例。又由于代表装饰的类和代表蛋糕的类都是Display
的实例,这样就可以一层又一层的装饰。
代码:
1 | public abstract class Display { |
1 | public class StringDisplay extends Display { |
1 | public abstract class Border extends Display { |
1 | public class FullBorder extends Border { |
1 | public class SideBorder extends Border { |
1 | public class Main { |
结果:
很显然,Java的IO就用到了装饰器模式。
缺点:
装饰器模式的一个缺点是会导致程序中增加许多功能类似的很小的类