6.装饰模式
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
UML类图关系:
(1)Component对象抽象类——对象类
有一个功能fun()
(2)Decorator装饰抽象类,继承对象类(或对象抽象类)
提供一个最重要的setComponent(Component com)方法,用来设置Component;
override要被装饰的对象类方法fun(),在里面调用super.fun()
(3)装饰具体类,继承抽象装饰类
override父类方法fun(),先调用super.fun(),然后可以添加自己的功能
把每个要装饰的功能放在单独的类中,并让这个类包装它要装饰的对象,当需要执行特殊行为时,客户端代码就可以根据需要有选择地、按顺序地使用装饰功能包装对象。下面是一个装饰例子:
//抽象对象类,可以给这些对象动态添加职责
abstract class Component {
public abstract void operation();
}
// 一个具体的对象,可以给这个对象添加职责(装饰这个对象)
class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.println("装饰该类");
}
}
/**
* 抽象装饰类,继承Component,在外面来扩展Component类的功能,即装饰它
* 在抽象装饰类中,实现component的原功能;在继承抽象装饰类的子类中实现新添加的功能
*/
abstract class Decorator extends Component {
private Component component;
// 设置要装饰的类Component
public void setComponent(Component component) {
this.component = component;
}
// 执行component的功能
@Override
public void operation() {
if (component != null) {
component.operation();
}
}
}
// 具体的装饰对象,给component添加职责
class ConcreteDecoratorA extends Decorator {
public void operation() {
super.operation(); // 执行父类的方法,保持原功能
System.out.println("A中添加新功能"); // 添加新功能
}
}
// 具体的装饰对象,给component添加职责
class ConcreteDecoratorB extends Decorator {
public void operation() {
super.operation(); // 执行父类的方法,保持原功能
System.out.println("B中添加新功能"); // 添加新功能
}
}
public class DecoratorTest {
public static void main(String args[]) {
Component component = new ConcreteComponent(); // 被装饰的对象
ConcreteDecoratorA a = new ConcreteDecoratorA(); // 装饰对象A
ConcreteDecoratorB b = new ConcreteDecoratorB(); // 装饰对象B
a.setComponent(component); // 用a来装饰component
b.setComponent(a); // 用b来装饰已被a装饰的compnent
b.operation(); // 执行b的功能,会依次向上执行父类的方法
}
}
输出结果:
装饰该类
A中添加新功能
B中添加新功能