一文带你厉害Java设计模式中的模板方法

yizhihongxing

一文带你厉害Java设计模式中的模板方法

什么是模板方法

模板方法是一种设计模式,其基本思路是定义一个算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法框架的情况下重新定义算法中的某些步骤。

模板方法的结构

模板方法包含两部分:抽象父类和具体实现子类。抽象父类定义了算法的框架,包括一些抽象方法;具体实现子类实现了抽象父类中的抽象方法。

以下是模板方法的结构:

public abstract class AbstractClass {
    protected abstract void primitiveOperation1();
    protected abstract void primitiveOperation2();

    final public void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
    }
}

public class ConcreteClass extends AbstractClass {
    @Override
    protected void primitiveOperation1() {
        // 具体实现1
    }

    @Override
    protected void primitiveOperation2() {
        // 具体实现2
    }
}

模板方法的优缺点

优点

  1. 提高代码的复用性,将公共部分抽象到父类中,避免重复代码。
  2. 提高扩展性,可以很方便地增加新的算法流程。
  3. 提高安全性,由于模板方法中的算法框架是固定的,避免了子类不当操作造成的风险。

缺点

  1. 需要把算法的框架固定下来,使得算法不能灵活变化。
  2. 继承关系过多,导致程序复杂。

示例1:炒菜模板方法

现在我们来写一个简单的例子,来解释模板方法的使用。

假设我们要用模板方法来实现一个“炒菜”的过程。

首先,我们需要定义一个抽象类Cook,其内部包含了一个炒菜的方法cook(),该方法是一个固定的算法框架。然后,我们再定义一个具体实现类EggplantPork分别实现Cook类,并重写cook()方法,完成炒茄子和炒肉的过程。

下面是示例代码:

public abstract class Cook {
    public final void cook() {
        prepare();
        stir_fry();
        cookRice();
    }

    abstract void prepare();

    abstract void stir_fry();

    void cookRice() {
        System.out.println("煮米饭");
    }
}

public class Eggplant extends Cook {
    @Override
    void prepare() {
        System.out.println("准备茄子");
    }

    @Override
    void stir_fry() {
        System.out.println("炒茄子");
    }
}

public class Pork extends Cook {
    @Override
    void prepare() {
        System.out.println("准备肉");
    }

    @Override
    void stir_fry() {
        System.out.println("炒肉");
    }
}

我们可以通过以下代码来调用:

Cook c1 = new Eggplant();
c1.cook();  // 准备茄子、炒茄子、煮米饭

Cook c2 = new Pork();
c2.cook();  // 准备肉、炒肉、煮米饭

运行结果如下:

准备茄子
炒茄子
煮米饭

准备肉
炒肉
煮米饭

示例2:JDBC模板方法

JDBC模板方法是一种常见的模板方法模式的应用。在JDBC中,我们可以使用模板方法来处理数据库的连接、事务以及SQL语句的执行,提高代码的复用性和可维护性。

下面是一个简单的JDBC模板方法的示例:

public abstract class JdbcTemplate {
    protected abstract String getUrl();
    protected abstract String getUsername();
    protected abstract String getPassword();

    public final <T> T execute(String sql, RowMapper<T> rowMapper) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接
            conn = DriverManager.getConnection(getUrl(), getUsername(), getPassword());
            // 开始事务
            conn.setAutoCommit(false);
            // 执行SQL语句
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            // 处理结果集
            List<T> result = new ArrayList<>();
            while (rs.next()) {
                result.add(rowMapper.mapRow(rs));
            }
            // 提交事务
            conn.commit();
            return result;
        } catch (SQLException e) {
            // 回滚事务
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            throw new RuntimeException(e);
        } finally {
            // 释放资源
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

public interface RowMapper<T> {
    T mapRow(ResultSet rs) throws SQLException;
}

我们可以使用以下代码来调用:

String sql = "SELECT id, name FROM person";
List<Person> result = new JdbcTemplate() {
    @Override
    protected String getUrl() {
        return "jdbc:mysql://localhost:3306/test";
    }

    @Override
    protected String getUsername() {
        return "root";
    }

    @Override
    protected String getPassword() {
        return "123456";
    }
}.execute(sql, rs -> {
    Person p = new Person();
    p.setId(rs.getInt("id"));
    p.setName(rs.getString("name"));
    return p;
});

总结:

模板方法是一种十分常用的设计模式,其可以大大减少代码的重复量,同时提高代码的可读性以及可维护性。在实践中,我们可以针对不同情况应用不同的模板方法模式,来达到我们想要的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你厉害Java设计模式中的模板方法 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • java报错:找不到或无法加载主类的解决方法简单粗暴

    下面是“java报错:找不到或无法加载主类”的解决方法攻略。 1. 确认类路径是否设置正确 当我们在运行java程序时,由于Java虚拟机需要加载主类,因此它会从我们设定的CLASSPATH环境变量中查找主类的位置。如果类路径设置不正确,就会导致找不到或无法加载主类的报错。 可以通过以下步骤来确认类路径是否设置正确: 打开命令行终端,进入java程序所在的目…

    other 2023年6月27日
    00
  • Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法

    这里是详细讲解“Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法”的完整攻略。 问题描述 当我在桌面上右键点击Excel图标,选择“新建工作表”时,发现工作表没有被新建出来。这是什么问题?有什么解决方法吗? 可能原因 这个问题有几种可能的原因,包括: Excel没有正确安装或受到病毒的侵扰; 你的系统或Excel设置发生了错误…

    other 2023年6月27日
    00
  • unicode字符集

    以下是“Unicode字符集”的完整攻略: Unicode字符集 Unicode是一种字符编码标准,用于表示世界上所有的字符。它包含了超过13万个字符,包括各种语言的字母、符号、标点符号、数字、图形符号等。本攻略将详细讲解Unicode字符集的概念、编码方式、应用场景等内容。 Unicode编码方式 Unicode字符集有多种编码方式,其中最常用的是UTF-…

    other 2023年5月8日
    00
  • Android中TabLayout添加小红点的示例代码

    当在Android中使用TabLayout时,可以通过添加小红点来显示未读消息或其他通知。下面是一个完整的攻略,包含两个示例说明。 示例1:在TabLayout中添加小红点 首先,在XML布局文件中添加TabLayout和ViewPager: <androidx.constraintlayout.widget.ConstraintLayout … …

    other 2023年9月6日
    00
  • 升级iOS16后没有开发者模式怎么办 iOS16打开开发者模式方法

    接下来我将为您详细讲解如何在升级iOS 16后打开开发者模式以及如何使用该模式进行开发。具体步骤如下: 1. 打开“设置”应用 首先,在iPhone、iPad或iPod touch设备的主屏幕上找到并打开“设置”应用。 2. 找到“关于本机”选项 在“设置”应用的顶部,您应该可以看到名为“[您的设备名称]”的选项。请点击进入,并向下滑动页面,找到“关于本机”…

    other 2023年6月26日
    00
  • rocketmq安装部署详细解析

    以下是关于“RocketMQ安装部署详细解析”的完整攻略,包括安装部署的介绍、示例说明等。 安装部署 RocketMQ是一个分布式消息列系统,用于处理大规模数据流。以下是一些常用的安装部署步骤: 下载RocketMQ安装包。 解压安装包到指定目录。 配置环境变量。 启动NameServer。 启动Broker。 验证RocketMQ是否正常运行。 示例说明 …

    other 2023年5月7日
    00
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    Nacos中的配置使用@Value注解获取不到值的原因及解决方案 原因分析 在使用Nacos作为配置中心时,有时候我们会遇到使用@Value注解获取配置值时无法获取到值的情况。这通常是由以下原因导致的: 依赖注入的问题:可能是因为没有正确配置依赖注入,导致@Value注解无法生效。 配置加载的时机:可能是因为配置加载的时机不正确,导致@Value注解在配置加…

    other 2023年8月6日
    00
  • Android 读取Properties配置文件的小例子

    下面让我来详细讲解“Android 读取Properties 配置文件的小例子”的完整攻略。 什么是Properties配置文件 Properties是Java类库提供的一种用于操作配置文件的类。它提供读取和写入简单键值对的功能。通常情况下,Properties用于存储应用程序的设置,例如数据库连接、日志级别、服务器地址等。 Properties配置文件的格…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部