类图
- 所有原始类与装饰者类都必须实现共同基类Beverage
- 所有装饰者类都持有另外一个属于基类类型的对象引用(这个饮用可以是原始类,也可以是装饰者类)
- 如果使用继承实现,每一种组合都必须编写一个对应的类,最后类的数量会变得无限大。因为继承实现,类的行为在编译期间就已经确定,组合的方式使得各种行为可以在“运行时”动态随意组合以实现层出不穷的新效果。
一些限制
- 会出现很多小类,其他代码查看人员不容易理解。
- 有的客户端代码不是依赖于超类型,而是依赖某个特殊的装饰类型或者基础类型,装饰将会受到限制。
实际项目中的应用
- 最著名的java.io库设计