委派模式与模板模式(5)

简介: 委派模式与模板模式(5)

六、模板方法模式在源码中的体现


先来看 JDK 中的 Abstractlist , 来看代码:


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    abstract public E get(int index);
}



我们看到 get()一个抽象方法 , 那么它的逻辑就是交给子类来实现,我们大家所熟知的 Arraylist

就是 Abstractlist 的子类。同理,有 Abstractlist就有 Abstractset 和 AbstractMap , 有兴趣的小伙伴可以去看看这些的源码实现。还有一个每天都在用的 HttpServlet, 有三个方法 service()和 doGet()、

doPost()方法,都是模板方法的抽象实现。


在 MyBatis框架也有—些经典的应用 ,我们来一下 BaseExecutor 类,它是—个基础的 SQL 执行类,

实现了大部分的 SQL 执行逻辑 ,然后把几个方法交给子类定制化完成 , 源码如下:


public abstract class BaseExecutor implements Executor {
  protected abstract int doUpdate(MappedStatement ms, Object parameter)
      throws SQLException;
  protected abstract List<BatchResult> doFlushStatements(boolean isRollback)
      throws SQLException;
  protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
      throws SQLException;
  protected abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)
      throws SQLException;
}


如 doUpdate、 doFlushStatements、 doQuery、 doQueryCursor 这几个方法就是交由子类来实

现, 那么 BaseExecutor 有哪些子类呢?我们来看一下它的类图:


image.png


我们一起来看—下 SimpleExecutor 的 doUpdate 实现


public class SimpleExecutor extends BaseExecutor {
  @Override
  public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
    Statement stmt = null;
    try {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
      stmt = prepareStatement(handler, ms.getStatementLog());
      return handler.update(stmt);
    } finally {
      closeStatement(stmt);
    }
  }
}


七、模板模式的优缺点

优点:


1、 利用模板方法将相同处理逻编的代码放到抽象父类中 , 可以提高代码的复用性。


2、 将不同的代码不同的子类中 , 通过对子类的扩展墙加新的行为 , 提高代码的扩展性。


3、 把不变的行为写在父类上 , 去除子类的重复代码 , 提供了一个很好的代码复用平台 , 符合开闭原则。


缺点:


1、 类数目的培加 , 每一个抽象类都需要一个子类来实现 , 这样导致类的个数谧加。


2、 类数呈的培加 , 间接地墙加了系统实现的复杂度。


3、 继承关系自身缺点 , 如果父类添加新的抽象方法 , 所有子类都要改—遍。


文章参考地址:

九、委派模式与模板模式详解


目录
相关文章
|
应用服务中间件 Linux nginx
CentOS下Nginx环境的搭建及进阶配置(安装篇)
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 本文主要讲解如何在CentOS搭建及配置Nginx
583 0
CentOS下Nginx环境的搭建及进阶配置(安装篇)
|
SQL 监控 数据库连接
数字安全网:深入解析服务容错的三大绝招“
数字安全网:深入解析服务容错的三大绝招“
91 1
|
JavaScript
【ElementUI】Vue+ElementUI多文件上传,一次请求上传多个文件!
教大家一次请求,上传多个文件。 ElementUI如果是默认方案,上传多张图片并不是真正的一次上传多张,而是发送多次请求,一次请求携带一张图片。
1261 0
|
9月前
|
人工智能 数据可视化 数据挖掘
【产品】G 端产品经理
G端产品经理在政府数字化转型中扮演着关键角色,连接政府需求与技术实现。他们负责挖掘需求、规划方案、推动跨部门协作,并监督项目进展。具体职责包括需求调研、产品规划与设计、原型制作、文档撰写及交互与视觉设计等。面对复杂多变的需求、快速更新的技术和严格的项目验收,G端产品经理需不断提升专业技能,以适应挑战并推动政府治理体系现代化。
|
10月前
|
SQL 数据可视化 数据挖掘
让项目数据更有说服力:五款必备数据可视化管理工具推荐
在现代企业管理中,数据是决策的重要依据。有效的数据可视化工具能帮助项目经理快速洞察项目进展、评估风险、优化资源配置。本文推荐五款必备的数据可视化管理工具,包括板栗看板、Power BI、Tableau、Google Data Studio和Qlik Sense,从功能、易用性和优缺点等方面进行全面评析,帮助您将数据转化为行动,推动项目高效前行。
317 4
|
10月前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
17598 7
|
Kubernetes 监控 API
Rancher 系列文章 -Rancher v2.6 使用脚本实现导入集群
Rancher 系列文章 -Rancher v2.6 使用脚本实现导入集群
|
9月前
|
存储 搜索推荐 安全
介绍几个常用的电商API接口及其应用场景。(一篇文章全清楚)
电商API接口是电商平台高效运营的核心技术支撑,涵盖商品管理、订单管理、支付、客户管理、营销推广和数据分析六大模块。商品管理API实现商品信息的精准上传与动态调整;订单管理API确保订单全流程透明可控;支付API保障交易安全便捷;客户管理API通过数据分析提供个性化服务;营销推广API助力精准营销;数据分析API为决策提供数据支持。各API协同工作,推动电商行业创新发展,构建智能便捷的电商生态。
925 12
|
机器学习/深度学习 人工智能 DataWorks
云上AI服务,中国最佳
云上AI服务,中国最佳
274 10
|
Cloud Native Devops 持续交付
探索云原生架构:未来企业技术演进的必由之路
随着数字化转型的浪潮席卷全球,企业正逐步将目光转向云原生架构,以期实现更高效、灵活且可扩展的IT服务。本文深入探讨了云原生的核心概念,包括容器化、微服务、持续集成与持续部署等,并阐述了这些技术如何共同促进现代企业的快速发展。同时,通过分析具体案例,展示了云原生在实际应用中带来的效益,以及企业在采纳云原生路径时可能面临的挑战和解决策略。