装饰模式(Decorator)
定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更灵活。属于结构型模式。
code
抽象构件,具体构件,抽象修饰类,具体修饰类。
特点
优点
- 扩展一个对象的功能比继承灵活,不会导致类个数急剧增加。
- 可以通过动态的方式扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体修饰类,实现不同的行为。
- 可以对一个对象进行多次修饰,通过使用不同的修饰类以及这些修饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。
- 具体构件类与具体修饰类可以独立变化发展,不会相互耦合,可以根据需要增加新的具体构件类和具体修饰类,原有类库代码无需改变,符合“开闭”原则。
缺点 - 使用装饰模式进行系统设计时将产生很多小对象。
- 多次修饰比继承易出错。
总结
装饰模式把类的核心职责和装饰功能分开了,为已有的功能动态地添加更多的功能,降低了系统耦合度。Java IO的输入输出流设计完美的运用了装饰模式。
适用场景
- 不影响其它对象下,动态透明的给单个对象添加职责。
- 不能采用继承的方式对系统进行扩展或采用继承不利于系统扩展和维护时。不能采用继承的情况:
- 系统中存在大量独立的扩展,组合将产生大量子类;
- 类不能被继承,如Java的final类.