• Java核心篇,二十三种设计模式(二十二),行为型——模板方法


    一、概念

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

           它由一个抽象类公开定义了执行它的方法的模板(执行的方式或顺序),它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。具体而言就是抽象类定义了某个方法的执行方式或者顺序,但是将该方法中的部分逻辑甚至全部逻辑实现交给具体的子类去实现,实现更高的抽象性;即父类模板方法定义不变的流程,子类重写流程中的方法

    二、应用场景

    多个子类有共有的方法,并且逻辑基本相同时。
    重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则又各个子类实现

    三、优缺点

    优点

    • 封装不变的部分,扩展可变的部分
    • 把认为不变的部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展
    • 提取公共部分代码,便于维护
    • 行为由父类控制,子类实现

    缺点

    • 子类执行的结果影响了父类的结果,这和我们平时设计习惯颠倒了,在复杂项目中,会带来阅读上的难度。
    • 可能引起子类泛滥和为了继承而继承的问题

    四、成员角色

    • 抽象模板(AbstractClass):抽象模板类,定义了一套算法框架/流程,即方法的执行方式和顺序
    • 具体实现(ConcreteClass):具体实现类,对算法框架/流程的某些步骤进行了实现

    AbstractClass 抽象模板中,通常包含以下两种方法:

    1.基本方法

    也叫基本操作,是由子类实现的方法,并且在模板方法中被调用

    2.模板方法

    可以有一个或者几个,实现对基本方法的调度,完成固定的逻辑;为了防止恶意操作,通常模板方法都加上 final 关键字,不允许覆写

    五、业务分析

    程序的执行离不开数据的支持,数据一般从数据库中拿到;从数据库中读取数据一般分为以下几个步骤:

    1. 建立连接
    2. 执行语句
    3. 读取/写入数据
    4. 关闭连接

    六、代码实现

    ReadDB

    1. package com.designer.template.AbstractClass;
    2. /**
    3. * 抽象模板(AbstractClass)
    4. */
    5. public abstract class ReadDB {
    6. protected abstract void connection();
    7. protected abstract void exec();
    8. protected abstract void readData();
    9. protected abstract void unConnection();
    10. public final void select(){
    11. connection();
    12. exec();
    13. readData();
    14. unConnection();
    15. }
    16. }

    SqlDB

    1. package com.designer.template.ConcreteClass;
    2. import com.designer.template.AbstractClass.ReadDB;
    3. /**
    4. * 具体实现(ConcreteClass)
    5. */
    6. public class SqlDB extends ReadDB {
    7. @Override
    8. protected void connection() {
    9. System.out.println("建立与数据库的连接");
    10. }
    11. @Override
    12. protected void exec() {
    13. System.out.println("执行 sql 语句");
    14. }
    15. @Override
    16. protected void readData() {
    17. System.out.println("读取数据库中的数据");
    18. }
    19. @Override
    20. protected void unConnection() {
    21. System.out.println("断开与数据库的连接");
    22. }
    23. }

    Test

    1. package com.designer.template;
    2. import com.designer.template.AbstractClass.ReadDB;
    3. import com.designer.template.ConcreteClass.SqlDB;
    4. public class Test {
    5. public static void main(String[] args) {
    6. ReadDB db = new SqlDB();
    7. db.select();
    8. }
    9. }

  • 相关阅读:
    EasyCVR新建用户分组显示不生效,是什么原因?
    MySQL是如何执行一条SQL更新语句
    RK3568-74HC595
    力扣100097. 合法分组的最少组数(哈希+贪心)
    豆瓣评分9.8,阿里内部的分布式架构手册让多少人突破了瓶颈?
    HTTP学习——跨域资源共享(CORS)
    YOLOv7训练:_pickle.UnpicklingError: STACK_GLOBAL requires str
    Arcgis常用操作技巧
    【金融】经济崛起之中的东南亚
    道路运输企业管理人员安全考核试题(附答案)
  • 原文地址:https://blog.csdn.net/ITlanyue/article/details/125469249