1.前言
装饰模式是结构型设计模式,从字面来理解这个模式,就如同人借用衣服等来装饰自己一样,不管装扮了什么样的衣服,人始终是人,(对象始终是不变的),只不过是装饰物在不断的改变。
2.定义
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
3.UML图
Component:抽象组件。可以是接口或者抽象类。
ConcreteComponent:具体组件。装饰的具体对象。
Decorator:抽象装饰者。职责就是装饰我们的组件对象,内部一定要有一个指向组件对象的引用。多数情况下,该类设计为抽象类。
ConcreteDecorartorA/B:具体装饰者。
4. 代码模板
public abstract class Component {
//
abstract void operate();
}
public class ConcreteComponent extends Component {
@Override
void operate() {
}
}
public abstract class Decorator extends Component{
private Component mComponent;//持有一个Component对象的引用
//必要的构造方法
public Decorator(Component component) {
mComponent = component;
}
@Override
void operate() {
mComponent.operate();
}
}
public class ConcreteDecoratorA extends Decorator {
protected ConcreteDecoratorA(Component component) {
super(component);
}
@Override
void operate() {
operateA();
super.operate();
opearateB();
}
//自定义的装饰方法A
public void operateA(){
}
//自定义的装饰方法B
public void opearateB(){
}
}
//构造被装饰的组件对象
Component component = new ConcreteComponent();
//根据组件对象构造装饰者对象A并调用
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
装饰者模式比较好理解,但是要注意它与代理模式的不同。
区别1:装饰者模式是以对客户端透明的方式扩展对象的功能,是继承关系的一种替代方案;代理模式是给一个对象提供一个代理对象,并有代理对象来控制对原对象的引用。
区别2:装饰模式应该为所装饰的对象增强功能;代理模式对代理的对象施加控制,但不对对象本身的功能进行增强。