装饰模式

一、定义

动态地给一个对象添加一些额外的职责。

二、使用场景

需要透明且动态地扩展类的功能时。

三、UML类图

装饰模式

Component:抽象组件,被装饰的原始对象。
ConcreteComponent:具体组件,被装饰的具体对象。
Decorator:抽象装饰者,装饰组件对象,其内部一定要有一个指向组件对象的引用。
ConcreteDecorator:具体装饰者,对抽象装饰者作出具体的实现。

四、实现

//抽象组件
public abstract class Component {
    public abstract void operate();
}

//具体组件
public class ConcreteComponent extends Component {
    @Override
    public void operate() {
        System.out.println("具体组件");
    }
}

//抽象装饰者,继承抽象组件
public abstract class Decorator extends Component{
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        component.operate();
    }
}

//具体装饰者
public class ConcreteDecorator extends Decorator {
    protected ConcreteDecorator(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        super.operate();
        System.out.println("具体装饰者");
    }
}

//客户端
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        Decorator decorator = new ConcreteDecorator(component);
        decorator.operate();
    }
}

五、应用

例子:Android Context

Context 层次结构

Context:相当于抽象组件。
ContextImpl:相当于具体组件。
ContextWrapper:持有Context的引用,相当于抽象装饰者。
Application、Service、ContextThemeWrapper、Activity:相当于具体装饰者。

六、总结

装饰模式与代理模式的区别:
装饰模式是对所装饰的对象增强功能;而代理模式则是对所代理的对象施加控制,但不对对象本身的功能进行增强。

你可能感兴趣的:(装饰模式)