概念
装饰模式:动态地给一个对象添加一些额外的职责。
Component是一个抽象的类,定义了对象接口。 ConcreteComponent是子类,定义了具体的方法的实现。
Decorator是继承自Component的抽象类,维护了一个Component的对象引用,并且实现了基类Component的功能。
ConcreteDecoratorA继承自Component,会执行基类Decorator的功能(也就是Component的功能),并执行本类的功能,相当于对Component进行了装饰。增加的功能可以是成员变量或方法等。
不同的Decorator类可以有不同的功能,对其装饰的对象进行包装。而且由于它们都是继承自component类,所以可以进行多层包装,像人可以穿上多件衣服,每一层包装就像加上了一层衣服。每个Decorator类只需要关注自己实现的功能即可。
代码实现
Component定义一个对象接口,ConcreteComponent是具体的要被装饰的类。
package decorator;
abstract public class Component {
public abstract void operation();
}
class ConcreteComponent extends Component{
public void operation() {
System.out.println("Component operation");
}
}
两种不同的装饰类分别增加不同的功能。
package decorator;
abstract public class Decorator extends Component {
protected Component component;
public void setComponent(Component component) {
this.component = component;
}
}
class ConcreteDecoratorA extends Decorator{
public void operation() {
component.operation();
System.out.println("DecoratorA operation");
}
}
class ConcreteDecoratorB extends Decorator{
public void operation() {
component.operation();
System.out.println("DecoratorB operation");
}
}
定义一个要被装饰的类,进行了两层包装。
package decorator;
public class DecoratorTest {
public static void main(String[] args) {
ConcreteComponent component = new ConcreteComponent();
ConcreteDecoratorA a = new ConcreteDecoratorA();
a.setComponent(component);
ConcreteDecoratorB b = new ConcreteDecoratorB();
b.setComponent(a);
b.operation();
}
}
实现了被包装类和两个装饰类中要实现的功能。
Component operation
DecoratorA operation
DecoratorB operation