装饰模式(Decorator) :动态的给一个对象增加一些额外的功能,就新增加功能来说,装饰模式比生成子类更为灵活。
举个例子: 举个不恰当的列子,比如小明穿衣服,小明是个最基本的对象,T恤和裤子就是两个装饰
类图:
Component: 定义一个对象接口,可以给这些对象动态的添加功能
ConcreteComponent : 定义一个具体的对象,给这个具体的对象增加功能。假如这个具体的对象就是小明
Decoratore :装饰器抽象类,继承Component,并持有一个Component对象
ConcreteDecoratoreA :具体的装饰器类,比如给小明穿衣服,穿裤子等,用来给ConcreteComponent增加功能
代码实例:
public abstract class Component {
public abstract void operation();
}
public class ConcreteComponent extends Component {
@Override
public void operation() {
System.out.print("小明:");
}
}
public class Decorate extends Component {
private Component mComponent;
public Decorate(Component component) {
this.mComponent = component;
}
@Override
public void operation() {
if (mComponent != null) {
mComponent.operation();
}
}
}
public class PantsDecorate extends Decorate {
public PantsDecorate(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
pantsBehavior();
}
private void pantsBehavior() {
System.out.print(" 裤子 ");
}
}
public class TshirtDecorate extends Decorate {
public TshirtDecorate(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
tshirtBehavior();
}
private void tshirtBehavior() {
System.out.print("衣服 ");
}
}
public class DecorateDemo {
public static void main(String[] args) {
ConcreteComponent xiaoMing = new ConcreteComponent();
PantsDecorate pantsDecorate = new PantsDecorate(xiaoMing);
TshirtDecorate tshirtDecorate = new TshirtDecorate(pantsDecorate);
tshirtDecorate.operation();
}
}
输出结果:小明: 裤子 衣服
总结:当系统需要新功能的时候,如果在旧的类中直接增加新的代码,则增加了类的复杂度。通过装饰模式,将这些新加入的功能放在单独的类中,并让这个类包装所要修饰的对象。当需要执行特殊的功能时,客户代码可以直接在运行是有选择的、按顺序的使用装饰器进行包装对象。比如上面例子中的给小明穿衣服,可以先穿T恤再穿裤子,也可以先穿裤子再穿T恤。