首页 > 其他分享 >设计模式---模板方法模式

设计模式---模板方法模式

时间:2022-10-27 23:47:19浏览次数:56  
标签:数据库 System 链接 --- println 设计模式 public 模板 out

简述

提取算法中不变的部分封装成方法,变化的部分延迟到子类

延迟到子类
这个说法在学习设计模式的时候经常出现,实际就是利用多态在子类中重写方法,使得实行时根据实例的类型调用不同的方法。

话不多说,看个案例。

优化案例

最初版v0

连接数据库我们有很多种方式,JDBC、JNDI、ODBC等等。下面是不使用设计模式模拟使用三种方式实现连接数据库。

public class Client {
    public static void main(String[] args) {
        JDBC jdbc = new JDBC();
        jdbc.execute(); // 使用jdbc连接数据库
        JNDI jndi = new JNDI();
        jndi.execute(); // 使用jndi连接数据库
        ODBC odbc = new ODBC();
        odbc.execute(); // 使用odbc连接数据库
    }
}

public class JDBC {
    public void execute() {
        System.out.println("读取数据库链接配置文件");
        System.out.println("使用JDBC建立数据库链接。。。");
        System.out.println("数据库链接成功");
    }
}

public class ODBC {
    public void execute() {
        System.out.println("读取数据库链接配置文件");
        System.out.println("使用ODBC建立数据库链接。。。");
        System.out.println("数据库链接成功");
    }
}

public class JNDI {
    public void execute() {
        System.out.println("读取数据库链接配置文件");
        System.out.println("使用JNDI建立数据库链接。。。");
        System.out.println("数据库链接成功");
    }
}

可以看出以上代码中有两处不变的代码 --> System.out.println("读取数据库链接配置文件")System.out.println("数据库链接成功")。这两处代码分别在三个类中重复了三次。案例中只有两行代码,问题不大,但是真实项目中可能会存在几百行代码完全相同但是到处都有的情况。为了解决这个问题,提高我们开发的效率,并且也能提高bug筛查的效率,我们可以使用模板方法模式。详细请看以下案例。

提高bug筛查的效率的原因
如果几百行的代码重复出现在十几个或者几十个不同的类中,当bug出现在一处代码时,为了确保系统不再出现同样的错误,需要把剩余所有相同的代码都检查一遍,这无疑增加了后期维护的成本。
而使用模板方法模式则可以省去很多花在这类杂活上的时间。

修改版v1

public class Client {
    public static void main(String[] args) {
        JDBC jdbc = new JDBC();
        jdbc.templateExecute(); // 使用jdbc连接数据库
        JNDI jndi = new JNDI();
        jndi.templateExecute(); // 使用jndi连接数据库
        ODBC odbc = new ODBC();
        odbc.templateExecute(); // 使用odbc连接数据库
    }
}

public abstract class DBConnection {
    // 模板方法
    public void templateExecute() {
        System.out.println("读取数据库链接配置文件"); // 不变的代码1
        this.execute();
        System.out.println("数据库链接成功"); // 不变的代码2
    }

    public abstract void execute();
}

public class JDBC extends DBConnection {
    public void execute() {
        System.out.println("使用JDBC建立数据库链接。。。");
    }
}

public class ODBC extends DBConnection {
    public void execute() {
        System.out.println("使用ODBC建立数据库链接。。。");
    }
}

public class JNDI extends DBConnection {
    public void execute() {
        System.out.println("使用JNDI建立数据库链接。。。");
    }
}

就增加一个抽象类和一个模板方法就解决了代码重复的问题。现在重复的代码就两行,所以效果不明显,如果是几百行,那效果立竿见影,而且模板方法模式也没有什么复杂的理念,简单易懂。悄悄告诉你,模板方法模式在各种框架中都是非常常见的。

总结

优点

  • 可以减少项目中大量重复代码。
  • 设计思想简单(就继承+多态),易懂。
  • 实现简单,只需要增加一个抽象类,增加一个模板方法即可。

缺点

  • 说实话,个人觉得没啥缺点。要是一个模板方法模式也能增加代码的阅读难度的话,还是转行比较好哈哈哈。

适用场景

  • 任何可以明确分清变化与不变化的代码。

标签:数据库,System,链接,---,println,设计模式,public,模板,out
From: https://www.cnblogs.com/spoonb/p/16834395.html

相关文章

  • Vue - axios
    Axios 发送GET请求 axios({//请求方式method:"GET",//请求地址url:"http://www.liulongbin.top:3006/api/g......
  • [qt-everywhere-src-6.4.0 QtWebEngineCore] 在 arm64 上出现 paciasp autiasp ASM指
    编译最后一个巨型模块QtWebEngineCore遇到的。../../../3rdparty/chromium/third_party/breakpad/breakpad/src/common/linux/breakpad_getcontext.S:145:Error:sele......
  • P4718 【模板】Pollard-Rho算法
    题目链接P4718【模板】Pollard-Rho算法题目描述MillerRabin算法是一种高效的质数判断方法。虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接......
  • #yyds干货盘点# 前端歌谣的刷题之路-第一百四十二题-单列布局
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了......
  • 7-1 哈夫曼编码
    给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长。然而哈夫曼编码并不是唯一的。例如对字符串"aa......
  • JAVA-二维数组元素打乱
    packagecom.itheima;importjava.util.Random;publicclassshuzu07{publicstaticvoidmain(String[]args){int[][]arr={{1,2,3},{4,5,6},{7,......
  • AtCoder Beginner Contest 247 E - Max Min
    题目描述简要描述:给定一个长度为\(N\)的数组,求数组的子数组满足最大值为\(X\)且最小值为\(Y\)的子区间的个数。做法1.ST表+二分时间复杂度:\(O(n\logn)\)......
  • 40-40-监控平台&服务治理设计实践课_ev
                                                         ......
  • 2022-10-27学习内容
    1.案例-找回密码-登录逻辑1.1LoginMainActivity.javapackagecom.example.chapter05;importandroidx.activity.result.ActivityResult;importandroidx.activity.re......
  • linux 中 wc -c命令
     001、统计字符数(包括空格和换行符)[root@pc1test]#lsa.txt[root@pc1test]#cata.txt##测试文件adtd[root@pc1test]#wc-ca.txt##wc-c命令......