notes notes
首页
  • 主题初衷与诞生
  • 介绍
  • 快速上手
  • 目录结构
  • 相关文章

    • 使目录栏支持h2~h6标题
    • 如何让你的笔记更有表现力
    • 批量操作front matter工具
    • 部署
    • 关于写文章和H1标题
    • 关于博客搭建与管理
  • PostgreSQL 全文搜索
  • 依赖注入
  • 开发常见问题
  • 逻辑删除
  • TCP 粘包和拆包
  • netty 粘包和拆包
  • 在k8s集群中搭建一个harbor私有仓库
  • 优雅停机
  • helm 命令学习
  • yield 关键字
  • 不定参数
TODO
  • REST API
  • 使用 IntelliJ IDEA 反编译 jar
  • Spring Boot 删除前后空白字符
  • 设计模式

    • 装饰器模式
Docker
Tool Box (opens new window)
GitHub (opens new window)
首页
  • 主题初衷与诞生
  • 介绍
  • 快速上手
  • 目录结构
  • 相关文章

    • 使目录栏支持h2~h6标题
    • 如何让你的笔记更有表现力
    • 批量操作front matter工具
    • 部署
    • 关于写文章和H1标题
    • 关于博客搭建与管理
  • PostgreSQL 全文搜索
  • 依赖注入
  • 开发常见问题
  • 逻辑删除
  • TCP 粘包和拆包
  • netty 粘包和拆包
  • 在k8s集群中搭建一个harbor私有仓库
  • 优雅停机
  • helm 命令学习
  • yield 关键字
  • 不定参数
TODO
  • REST API
  • 使用 IntelliJ IDEA 反编译 jar
  • Spring Boot 删除前后空白字符
  • 设计模式

    • 装饰器模式
Docker
Tool Box (opens new window)
GitHub (opens new window)
  • Java

    • 问答
    • 使用 IntelliJ IDEA 反编译 jar
    • Spring Boot 删除前后空白字符
  • 设计模式

    • 装饰器模式

      • 装饰器模式
        • 装饰器模式
          • 典型应用
          • 思考
目录

装饰器模式

# 装饰器模式

装饰器模式(Decorator Pattern)是一种结构性模式,它用于在不改变对象现有结构(方法数和方法签名都不变)的前提下向其新增功能。

# 典型应用

Mybatis 中的 org.apache.ibatis.executor.Executor 是一个典型的案例。

设想一下,如果我们是 Mybatis 的开发者,我们设计了 org.apache.ibatis.executor.Executor 接口,并添加了不同的实现类,类图如下:

avatar

此时,如果我们想要为这些 Executor 添加缓存功能,我们就可以使用装饰器模式,类图如下:

avatar

新增一个装饰类 CachingExecutor:

  1. 实现 org.apache.ibatis.executor.Executor 接口
  2. 持有一个被装饰的 org.apache.ibatis.executor.Executor 对象,所有操作都会委托给该对象完成

这样,我们有可能在其操作之前或者之后添加额外功能,如:

public class CachingExecutor implements Executor {
    private final Executor delegate;

    public CachingExecutor(Executor delegate) {
        this.delegate = delegate;
        ...
    }

    ...
    // 以 update 方法为例,在委托类执行操作之前先清空缓存
    public int update(MappedStatement ms, Object parameterObject) throws SQLException {
        this.flushCacheIfRequired(ms);
        return this.delegate.update(ms, parameterObject);
    }
    ...
}

# 思考

想要添加缓存功能,其实我们也可以直接修改 BaseExecutor, 但这样做缺点很明显:

  1. 如果 BaseExecutor 是在第三方依赖中,则无法直接修改 BaseExecutor
  2. 如果有多个 BaseExecutor,则每一个都需要改

因此装饰器模式是一种较好实践。

上次更新: 2023/12/08, 06:34:37
Spring Boot 删除前后空白字符

← Spring Boot 删除前后空白字符

Theme by Vdoing | Copyright © 2023-2023
Powered by vuepress-theme-vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式