Java的23种设计模式:模板方法模式实战

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

模板方法模式是一种行为型设计模式,在父类定义具体固定流程和默认行为,由子类来按需实现自身的具体行为,子类不能改变父类制定的流程。 本文详细介绍了模板方法模式的代码分析、测试方法、优缺点、使用场景等,并…

模板方法模式是一种行为型设计模式,在父类定义具体固定流程和默认行为,由子类来按需实现自身的具体行为,子类不能改变父类制定的流程。

本文详细介绍了模板方法模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码和提供下载链接。

本文你将会获得以下知识:

  1. 模板方法模式的完整代码
  2. 模板方法模式的优缺点
  3. 模板方法模式的使用场景

适合人群:Java中高级开发。



一、前言

在日常项目开发过程中,模板方法模式是比较常用的模式之一,个人觉得运用它来设计可以提取出固定流程的业务场景,不但可以提升个人设计水平,而且还可以彰显个人技术魅力征服公司上级领导或者漂亮开发美眉。

本文详细介绍了模板方法模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码和提供下载链接。

二、概念介绍

  1. 抽象模板角色(AbstractTemplate) 定义一个或多个使用final修饰的模板方法,确保模板方法可以按顺序执行基本方法,
  2. 具体模板角色(ConcreteTemplate) 继承抽象模板类并重写其一个或多个抽象方法实现自身的业务逻辑。

    各个组件之间的关系图如下: 在这里插入图片描述

三、代码分析

  1. 代码结构 在这里插入图片描述
  2. 模板方法模式 下面是拿JDBC操作数据库作为例子进行讲解并编码,操作流程:注册驱动->获取连接->创建Statement->执行SQL语句->处理结果集->处理异常并关闭JDBC对象资源,每一种数据库的操作都必须经过这些流程。

    创建一个抽象模板角色JDBC模板抽象类,定义一个流程模板方法,保证所有数据库的流程都一致,方法使用final修饰,防止子类重写父类方法改变方法执行顺序,代码如下:

    /** * 抽象模板角色,JDBC抽象模板 */public abstract class JDBCTemplate {
    /** * 流程模板方法,保证所有数据库的流程都一致 * 方法使用final修饰,防止子类重写父类方法改变方法执行顺序 */public final void process(){    //1.注册驱动Register driver    registerDriver();    //2.获取连接    getConnection();    //3.创建Statement    createStatement();    //4.执行SQL语句    executeSQL();    //5.处理结果集    handleResultSet();    //6.处理异常并关闭JDBC对象资源    closeResource();}/** * 数据库驱动都不一样 */public abstract void registerDriver();/** * 数据库连接都不一样 */public abstract void getConnection();/** * 所有数据库都需要创建Statement */public void createStatement(){    System.out.println(\"创建Statement\");}/** * 不用数据库SQL语法不一样 */public abstract void executeSQL();/** * 所有数据库都需要处理结果集 */public void handleResultSet(){    System.out.println(\"处理结果集\");}/** * 所有数据库都需要处理异常并关闭JDBC对象资源 */public void closeResource(){    System.out.println(\"处理异常并关闭JDBC对象资源\");}
    } 

    创建两个具体模板类角色,分别是MySql模板类和Oracle模板类,实现各自数据库的具体操作,比如:MySql数据库则注册MySql驱动,Oracle数据库则注册Oracle驱动,代码如下:

    /** * 具体模板角色,MySql模板 */public class MySqlTemplate extends JDBCTemplate {    @Override    public void registerDriver() {        System.out.println(\"注册MySql驱动\");    }
    @Overridepublic void getConnection() {    System.out.println(\"获取MySql连接\");}@Overridepublic void executeSQL() {    System.out.println(\"执行MySql语句\");}
    } /** * 具体模板角色,Oracle模板 */ public class OracleTemplate extends JDBCTemplate { @Override public void registerDriver() { System.out.println(\"注册Oracle驱动\"); }
    @Overridepublic void getConnection() {    System.out.println(\"获取Oracle连接\");}@Overridepublic void executeSQL() {    System.out.println(\"执行Oracle语句\");}
    } 

    模板方法模式测试代码如下:

    public class TestForTemplate {
    public static void main(String[] args) {    //执行Msql语句的流程    JDBCTemplate mysql = new MySqlTemplate();    mysql.process();    System.out.println(\"=============================\");    //执行Oracle语句的流程    JDBCTemplate oracle = new OracleTemplate();    oracle.process();}
    } 

四、代码测试

模板方法模式,运行TestForTemplate类中的main方法 控制台日志:

注册MySql驱动获取MySql连接创建Statement执行MySql语句处理结果集处理异常并关闭JDBC对象资源=============================注册Oracle驱动获取Oracle连接创建Statement执行Oracle语句处理结果集处理异常并关闭JDBC对象资源

在这里插入图片描述

五、优缺点

优点:

  • 抽象模板类(父类)控制行为和执行顺序,具体模板类(子类)实现具体行为。
  • 可扩展性好,很容易扩展子类个性行为

缺点:

  • 父类调用子类方法,加大了代码的理解难度

六、使用场景

  1. 在各个子类中可以提取公共行为(即固定的流程)的场景
  2. Spring中的JdbcTemplate、HibernateTemplate等等
  3. Spring中AbstractApplicationContext中的refreash()模板方法
  4. 做试卷场景,考生的题目(模板)都一样,只是每个人的答案(具体实现)不相同。

七、总结

通过这次的模板方法模式实战,让我们掌握了模板方法设计模式是什么、代码如何编写及测试、优缺点及使用场景,学完本文内容后,可以快速把模板方法模式代码运用到日常开发中“肆无忌惮的装逼”,呵呵呵。

模板方法模式实战完整代码已上传到 Gitee,下载地址如下:https://gitee.com/romantic-pk/demo-template.git

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。