学习资料主要参考: 《Head First 设计模式》
简述
装饰者模式“给喜欢用继承的人,一个全新的设计眼界”。一旦熟悉了装饰的技巧,就可以在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。
简单流程:
- 获取一个基本对象
- 拿另外一个对象装饰它
- 调用它的方法,并依赖委托获取装饰者信息
开发-关闭原则
类应该对扩展开放,对修改关闭。
这样的设计,既保证了类的弹性以面对改变,又能避免修改原有的健康代码。
但是我们没必要让每处地方都遵循这个原则,否则代码就会变得复杂且难以理解。
特点
- 装饰者和被装饰者具有相同的超类型
- 可以用一个或者多个装饰者来装饰同一个对象
- 在需要原始对象的场合,可以用装饰过的对象替代
- 装饰者可以在所委托被装饰者的行为之前/之后,加上自己的行为,以达到特定目的
- 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地使用各种装饰者来装饰对象
装饰者模式:动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。
public abstract Component{
void methodA();
void methodB();
}
public ConcreteComponent extends Component{
void methodA();
void methodB();
}
public Decorator extends Component{
void methodA();
void methodB();
}
public ConcreteDecoratorA extends Decorator{
Component wrappedObj;
void methodA();
void methodB();
void newBehavior();
}
Java 中的装饰者:I/O
比如 BufferedInputStream 以及 Line NumberInputStream 都拓展自 FilterInputStream,而 FilterInputStream 是一个抽象的装饰类。
装饰 java.io 类:
缺点
- 在代码中引入大量的小类
- 客户端若是依赖特定的类,但是却忽然导入装饰者,可能会引起错误
- 实例化组件过于复杂