装饰器模式
描述
装饰器模式是一种功能型模式
用于动态增强 对象的功能
这么一说感觉上和代理模式有些类似
抽象装饰器 要实现原有业务接口,并注入原有业务对象
至于对原有业务对象的调用,可以采用private业务对象 + 实现业务接口方法的形式 或者 protected + 具体装饰类调用原有对象方法
但是装饰器在有些点上可能违反里氏替换原则,特别是装饰器存在重载的时候要注意
基本使用
- 定义一个抽象业务接口(这是实现装饰器模式的基础)
java
public interface IService {
void biz();
}
- 原有业务实现类
java
public class DefaultService implements IService {
@Override
public void biz() {
System.out.println("DefaultService....");
}
}
- 装饰器抽象(通常是抽象类,持有原有对象的引用)
java
public abstract class AbstractWrapper implements IService {
private IService service;
public AbstractWrapper(IService service) {
this.service = service;
}
@Override
public void biz() {
service.biz();
}
}
- 具体装饰器
java
public class WrapperA extends AbstractWrapper {
public WrapperA(IService service) {
super(service);
}
@Override
public void biz() {
super.biz();
this.wrapperA();
}
private void wrapperA() {
System.out.println("WrapperA 增强方法");
}
}
public class WrapperB extends AbstractWrapper {
public WrapperB(IService service) {
super(service);
}
@Override
public void biz() {
super.biz();
this.wrapperA();
}
private void wrapperA() {
System.out.println("WrapperB 增强方法");
}
}
使用
java
public class Sample {
public static void main(String[] args) {
IService service = new DefaultService();
service.biz();
System.out.println("===== 使用装饰器 ===");
IService wrapper = new WrapperA(new WrapperB(service));
wrapper.biz();
}
}