浅谈装饰器设计模式
一、概念
《Thinking in Java》: 装饰器模式使用分层对象来动态透明地向单个对象中添加责任。装饰器指定包装在最初地对象周围地所有对象都具有相同的基本接口。某些事物是可装饰的,可以通过将其它类包装在这个可装饰对象的四周,从而将功能分层,这使得对装饰器的使用是透明的——无论对象是否被装饰,你都拥有一个可以向对象发送的公共消息集。
二、结构
结构如下图所示(图片来源于互联网):
在装饰器模式中有如下一系列角色:
- 抽象构件角色(component):给出抽象接口,规范准备接收附加责任的对象;
- 具体构件角色(Concrete Component):定义一个将要接收附加责任的对象:
- 装饰角色(Decorator):持有一个构件对象的实例,并且实现了抽线构件规定的接口;
- 具体装饰角色(Concrete Decorator):负责给构件对象增加附加的责任;
如何理解装饰器设计模式的运行原理?
在上图中,ConcreteDecoratorA与ConcreteDecoratorB都是具体装饰器,它们的构造函数接收一个具体构件(Concrete Component)角色对象,由于具体装饰器器继承自装饰角色,其内部都声明了一个能够指向具体构件的变量,因此该变量最后会指向我们向装饰器传递的具体构件的对象,而具体装饰器角色对象也有具体构件角色的接口(这就是抽象构件角色所起到的作用之一,规范接口),因此,装饰器就可以调用具体构件的接口了,并且,还可以增加功能。
下面给出一个简单的示例
抽象构件
public interface Component{
public void operation();
}
装饰角色
public class Decorator implements Component{
protected Component component;
public Decorator(Component component){
this.component = component;
}
@override
public void operation(){
// 可以增加功能,调用具体构件的接口
component.operation();
}
}
具体装饰器角色
pubic class SpecialDecorator extends Decorator{
public SpecialDecorator(Component component){
super(component);
}
@override
public void operation(){
// 可以增加功能,也可以调用具体构件接口
super.operation();
System.out.print("我是具体装饰器角色增加的功能");
}
}
具体构件角色
public class ConcreteComponent implements Component{
@override
public void operation(){
// 业务代码
}
}