装饰模式主要用于对一个对象A的方法进行持续性地增强的模式。其采用多态的方式,通过一个装饰类含有下一个装饰类的引用进行不断地调用,最终会调用到最原始的那个对象A,从而使原始对象A拥有了许多其根本没有的功能。
下图为装饰模式的一个静态UML类图结构:
下面给出上面UML结构的代码参考实现。
抽象组件Component的代码如下:
public interface Component
{
void sampleOperation();
}
具体组件即原始对象A(而要功能增强的对象)代码如下:
public class ConcreteComponent implements Component
{
public void sampleOperation()
{
// Write your code here
}
}
抽象装饰类Decorator的代码如下:
public class Decorator implements Component
{
private Component component;
publicDecorator(Component component)
{
this.component = component;
}
public Decorator() {
}
public void sampleOperation()
{
component.sampleOperation();
}
}
该类这里用一个具体的类进行表示,但是在实际中,可以将其设定为抽象类会更为合理一些,同时将sampleOperation()这个方法设定为抽象方法,要求所有的具体的装饰类实现该方法。
具体装饰类ConcreteDecorator的代码如下:
public class ConcreteDecorator extends Decorator
{
public void sampleOperation()
{
//可以在此处附加一些业务方面
//....................
super.sampleOperation();
}
}
下面给出一个创建装饰类的典型代码:
New Decorator1(
New Decorator2(
New Decorator3(
NewConcreteComponent()
)
)
);
装饰模式与责任链模式有些类似,都是一个对象含有下一个对象的引用,而对客户端而言,只需要从第一个对象进行调用即可,不用关心最终是由哪一个对象进行执行的,但是二者还是有很多区别,首先,装饰模式一定是有一个最原始的对象,而其他的装饰类都是对这个原始的对象的增强的,所以通常情况下,其他装饰类的对应的方法都会被调用,一直到达最原始的这个对象。而责任链却未必会所有的责任对象都过一遍,它只要到达其所需要的地方就可以直接退出了。从本质上来看,责任链虽然前一个对象会含有后一个对象的引用,但是二者是平等的,但是装饰模式却不是,他是不平等的,最原始的那个对象是一定要被调用的,而其他的装饰对象则是对这个原始对象的增强,包装。