设计模式简述(十一)装饰器模式

装饰器模式

描述

装饰器模式是一种功能型模式

用于动态增强 对象的功能

这么一说感觉上和代理模式有些类似

抽象装饰器 要实现原有业务接口,并注入原有业务对象
至于对原有业务对象的调用,可以采用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();
    }
}
相关推荐
软考真题app12 小时前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin033317 小时前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin18 小时前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan19 小时前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免20 小时前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死1 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式
敲代码的 蜡笔小新2 天前
【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
unity·设计模式·架构·命令模式
m0_555762902 天前
D-Pointer(Pimpl)设计模式(指向实现的指针)
设计模式