装饰器模式
定义
也称包装模式,是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。
装饰器模式的核心是功能扩展。使用装饰器模式可以透明且动态地扩展类的功能。
其实现原理:让装饰器类实现被包装类相同的接口(使得装饰器与被扩展类类型一致),并在构造函数中传入该接口对象,然后就可以在接口需要实现的方法中在被包装类对象的现有功能上添加新功能。而且由于装饰器与被包装类属于统一类型,且构造函数的参数为其实现的接口类,因此装饰器模式具备嵌套扩展功能,这样我们能使用装饰器模式一层一层的对最底层被包装类进行扩展。
角色
- 抽象组件(Component):可以是一个接口或者抽象类,其充当被修饰类的原始对象,规定里装饰器的行为。
- 具体组件(ConcreteComponent):实现/继承Component的一个具体对象,也称被装饰对象。
- 抽象装饰器(Decorator):通用的装饰ConcreteComponent的装饰器,其内部必然有一个属性指向Component抽象组件;其现实一般是一个抽象类,只要是为了让其子类按照其构造形式传入一个Component抽象组件,这是强制的通用行为;
- 具体装饰器(ConcreteDecorator):Decorate的具体实现类,理论上每个ConcreteDecorator都扩展了Component对象的一种功能。
适用情景
- 用于扩展一个类的功能或给一个类添加附加职责。
- 动态地给一个对象添加功能,这些功能可以再动态地撤销。
优点
- 装饰器是继承的有力补充,比继承更加灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
- 通过使用不同装饰类以及这些装饰类的组合排列组合,可以实现不同的效果。
- 装饰器完全遵守开闭原则。
缺点
- 会出现更对的代码,更多的类,增加程序复杂性。
- 动态装饰时,多层装饰或更加复杂。
通用写法
public abstract class Component {
public abstract void operation();
}
public class ConcreteComponent extends Component{
@Override
public void operation() {
System.out.println("处理相应的逻辑");
}
}
public abstract class Decorator extends Component{
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation(){
component.operation();
}
}
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component) {
super(component);
}
private void operationFirst(){ } //在调用父类的operation方法之前需要执行的操作
private void operationLast(){ } //在调用父类的operation方法之后需要执行的操作
public void operation(){
operationFirst();
super.operation();
operationLast();
}
}
public class Client {
public static void main(String[] args) {
Component c = new ConcreteComponent(); //首先创建需要被装饰的原始对象(即要被装饰的对象)
Decorator a = new ConcreteDecorator(c); //给对象透明的增加功能A并调用
a.operation();
}
}
实例
典型的装饰器模式
InputStream in = new FileInputStream("");
BufferedInputStream bis = new BufferedInputStream(in);
bis.read();
bis.close();
BufferedReader br = new BufferedReader(new FileReader(""));
br.readLine();
BufferedReader bs = new BufferedReader(new StringReader(""));
bs.readLine();
装饰器模式与代理模式对比
- 装饰器就是一种特殊的代理模式。
- 装饰器模式强调自身的功能扩展,用自己说了算的透明扩展,可动态定制扩展。
- 代理模式强调代理过程的控制。