装饰者模式笔记
装饰者模式是在不改变原类文件和不使用继承的情况下,动态地扩展一个对象的功能。它通过创建一个包装对象,持有一个真实对象的引用,进而来装饰包裹真实的对象。
装饰模式是一种用于替代继承的技术,通过一种无需定义子类的方法来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类,在装饰类中既可以调用被装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。
定义:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
可以通过下图了解装饰模式的结构图:
从上面的的结构图中看到包含以下几个角色:
Component抽象构件:它是具体构件和抽象装饰类的共同父类,它声明了需要在具体构件中实现的方法。
ConcreteComponent具体构件:实现在抽象构件中声明的方法,而装饰类在执行期间实际上也是针对具体构件进行装饰的。
Decorator抽象装饰类:抽象装饰类作为抽象构件的子类,同样含有父类声明的方法,而同时它持有一个具体构件的引用,可以通过该引用调用装饰前的具体构件的方法,然后在子类中扩展该方法,实现装饰扩展的效果。
ConcreteDecorator具体装饰类:抽象装饰类的子类,实现具体的职责或者增加新的行为。
实现代码如下:
class Decorator implements Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation(){
component.operation();
}
}
class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
public void operation(){
super.operation();
addedBehavior()//在具体装饰类里面可以增加新的行为扩展该方法达到装饰的目的。
}
public void addedBehavior() { };
}
class Client {
public static void main(String args[]) {
Component component = new ConcreteComponent();
Component comDecorator = new ConcreteDecorator(component);
//从上面可以看出 创建的所有对象都可以使用抽象构件来表示,因为都是它的子类,因此对于来说透明。
comDecorator.operation();
}
}
如果需要在原有的系统上添加新的具体构件类或者新的具体装饰类也很简单,通过装饰模式可以大大减少系统中的子类的个数。
对于在具体装饰类中增加接口行为,如果客户端想单独调用的话那么就不能简单的都通过抽象构件去声明,因为抽象构件是不含有这个方法的。这里就需要分透明装饰模式和非透明装饰模式。
总结:
装饰模式可以替代继承方法来动态的扩展一个对象的功能。在透明装饰模式中,因为具体装饰类和具体构件类都是抽象构件类的子类,因为在客户端看来是透明的,没有区别。而如果后续增加功能直接添加具体装饰类即可,无需更改原有的代码。