装饰器模式概述
装饰器模式也称为包装模式,适用于在不改变原有类的情况下,增强类对象的功能
UML
结构
组件接口:定义组件应有的功能
具体组件:实现了组件接口,需要被装饰的对象
装饰器:抽象类,引用和实现组件接口,默认调用组件类的operation方法,也可在组件原有功能的基础上进行增强
具体装饰类:继承自装饰器抽象类,通过重写组件类的operation方法,增强其功能并调用父类的operation方法
代码
package com.hpp.decorator;
public interface Component {
public void operation();
}
package com.hpp.decorator;
// 具体的组件类
public class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("正常操作");
}
}
package com.hpp.decorator;
// 装饰类, 继承Component接口, 并声明使用一个Component实例
public abstract class Decorator implements Component {
Component component;
public void setComponent(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
package com.hpp.decorator;
//继承了装饰类的 具体的装饰器类A
public class ConcreteDecoratorA extends Decorator {
@Override
public void operation() {
// 装饰的代码
System.out.println("封装数据为指定格式");
// 执行完上面的装饰逻辑后, 再调用传入的原组件类方法
super.operation();
}
}
package com.hpp.decorator;
// 继承了装饰类的 具体的装饰器类B
public class ConcreteDecoratorB extends Decorator {
@Override
public void operation() {
System.out.println("执行记录日志操作");
super.operation();
}
}
package com.hpp.decorator;
public class TestMain {
public static void main(String[] args) {
Component c = new ConcreteComponent();
Decorator decoratorA = new ConcreteDecoratorA();
Decorator decoratorB = new ConcreteDecoratorB();
// 对组件对象进行B装饰
decoratorB.setComponent(c);
// 对已经装饰上B的对象进行装饰
decoratorA.setComponent(decoratorB);
// 执行最后的装饰结果
decoratorA.operation();
}
}
最终输出的结果:
封装数据为指定格式
执行记录日志操作
正常操作
优点
将装饰功能从原有类中抽离出来,能在不修改原有类的基础上增强其功能,而每个具体装饰器只需关心自己的功能。
才疏学浅,如文中有错误,感谢大家指出。