1、定义
动态的将新功能附加到对象上,在功能扩展的时候,它比继承更加灵活。
2、使用场景
需要动态的扩展类的功能,当成继承的一种替代方案。
3、UML类图
4、代码实现
/**
* 抽象组件,所有的装饰者都是Component类型
*/
public interface Component {
void operate();
}
/**
* 具体组件,被装饰的对象
*/
public class ConcreteComponent implements Component {
@Override
public void operate() {
System.out.println("ConcreteComponent operate");
}
}
/**
* 抽象装饰者
* 其内部一定要有一个指向组件对象的引用,在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类
* 如果装饰逻辑单一,只有一个的情况下可以省略该类直接作为具体的装饰者
*/
public abstract class Decorator implements Component {
private Component component;
/**
* @param component 传入被装饰的具体Component对象
*/
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}
/**
* 具体的装饰者
*/
public class ConcreteDecoratorA extends Decorator {
/**
* @param component 传入被装饰的具体Component对象
*/
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
//装饰方法A和B既可在父类方法调用之前调用也可以在之后调用
operateA();
super.operate();
operateB();
}
/**
* 自定义装饰方法A
*/
private void operateA() {
//装饰逻辑A
}
/**
* 自定义装饰方法B
*/
private void operateB() {
//装饰逻辑B
}
}
public class MainTest {
public static void main(String[] args) {
//具体被装饰对象
Component component = new ConcreteComponent();
Decorator concreteDecoratorA = new ConcreteDecoratorA(component);
concreteDecoratorA.operate();
}
}
5、总结
装饰者模式和代理模式很类似,在代理对象中同样持有被代理对象的引用。装饰者模式是继承的一种代替的方案,通常情况下,装饰者应为所装饰的对象进行功能的增强和扩展,如Java的IO操作,而代理模式则是对被代理对象进行控制,不会进行功能上的增强。
代码:https://gitee.com/os2chen/DesignPattern
参考:《Head First Design》、《Android源码设计模式解析与实战》