裝飾器模式
- 描述
- 基本使用
- 使用
描述
裝飾器模式是一種功能型模式
用于動態增強對象的功能
這么一說感覺上和代理模式有些類似
抽象裝飾器 要實現原有業務接口,并注入原有業務對象
至于對原有業務對象的調用,可以采用private業務對象 + 實現業務接口方法的形式 或者 protected + 具體裝飾類調用原有對象方法
但是裝飾器在有些點上可能違反里氏替換原則,特別是裝飾器存在重載的時候要注意
基本使用
- 定義一個抽象業務接口(這是實現裝飾器模式的基礎)
public interface IService {void biz();
}
- 原有業務實現類
public class DefaultService implements IService {@Overridepublic void biz() {System.out.println("DefaultService....");}
}
- 裝飾器抽象(通常是抽象類,持有原有對象的引用)
public abstract class AbstractWrapper implements IService {private IService service;public AbstractWrapper(IService service) {this.service = service;}@Overridepublic void biz() {service.biz();}
}
- 具體裝飾器
public class WrapperA extends AbstractWrapper {public WrapperA(IService service) {super(service);}@Overridepublic void biz() {super.biz();this.wrapperA();}private void wrapperA() {System.out.println("WrapperA 增強方法");}
}public class WrapperB extends AbstractWrapper {public WrapperB(IService service) {super(service);}@Overridepublic void biz() {super.biz();this.wrapperA();}private void wrapperA() {System.out.println("WrapperB 增強方法");}
}
使用
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();}
}