23种设计模式_MODE14模板模式_手写代码实现

简介: 23种设计模式_MODE14模板模式_手写代码实现

1.模板方法测试

package com.zhaoshuangjian.mode14_模板模式;
import com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现.GoodsQueryServiceImpl;
import com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现.UserQueryServiceImpl;
import com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现.AbstractJdbcTemplate;
import com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现.GoodsTemplateImpl;
import com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现.UserTemplateImpl;
import com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤.AbstractCalculator;
import com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤.Plus;
import com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤.Sub;
import java.sql.SQLException;
/**
 * <p>模板方法测试</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class TemplateTest {
    public static void main(String[] args)  throws SQLException{
        calculate();
        jdbc();
        jdbcCallBack();
    }
    private static void calculate(){
        System.out.println("====================== 11 + 2 加法公式计算 ");
        AbstractCalculator plus = new Plus();
        System.out.println(plus.calculate("11 + 2", "\\+"));
        System.out.println("====================== 11 - 2 减法公式计算");
        AbstractCalculator sub = new Sub();
        System.out.println(sub.calculate("11 - 2", "\\-"));
    }
    private static void jdbc() throws SQLException {
        System.out.println("====================== 用户数据层操作实现 ");
        AbstractJdbcTemplate userTemplate = new UserTemplateImpl();
        userTemplate.execute("select * from user ");
        System.out.println("====================== 商品数据层操作实现 ");
        AbstractJdbcTemplate goodsTemplate = new GoodsTemplateImpl();
        goodsTemplate.execute("select * from goods ");
    }
    private static void jdbcCallBack() throws SQLException {
        System.out.println("====================== 用户数据层操作实现(模板+回调) ");
        UserQueryServiceImpl queryService = new UserQueryServiceImpl();
        queryService.query("select * from user ");
        System.out.println("====================== 商品数据层操作实现(模板+回调)");
        GoodsQueryServiceImpl goodsQueryService = new GoodsQueryServiceImpl();
        goodsQueryService.query("select * from goods ");
    }
    /**
     *
     * 百科中如此描述模板方法:
     * 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。
     * 让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
     *
     * 模板方法和策略模式有点像,都是由子类最终实现算法,二者区别是:
     * (1)策略模式定义了一个统一的算法接口,由具体的算法子类实现,所有的算法方法必须暴露给子类,
     *      由子类来实现,这样会产生一个问题,就是在执行算法之前如果有大量的数据准备工作,则会
     *      增加子算法方法块代码的臃肿度,使得大量代码重复得不到复用!
     * (2)模板方法定一个抽象的类,由父类统一定义实现算法的步骤,具体实现延迟到子类,
     *      属于算法"定制",对特定的重复的算法部分实现了封装,只对扩展的部分暴露给子类!
     *
     *   优点:
     *   想必不用说,我们都可以看出来,模板方法的一个最大的好处就是实现了重复代码的复用!
     *   另外一个就是,扩展很方便!
     *   缺点:
     *   和策略模式一样,也存在子类过多的情况出现,类一多,维护起来的复杂度就增加了!
     *
     *   <p>假如,一个抽象类有4个子类,你可能会说,也就才4个啊,半个小时都能看的透透彻彻了</p>
     *   <p>假如,一个抽象类有100个子类,你可能会皱着眉头说,卧槽,这特么还是人吗,怎么写了这么多?</p>
     *   <p>所以,类并不是越多越能体现系统的健壮性,反而多了会适得其反噢!</p>
     */
}

2.商品查询业务类

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * <p>商品查询业务类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class GoodsQueryServiceImpl {
    public Object query(String sql) throws SQLException{
        return  new JdbcTemplate().executeQuery(new GoodsQueryStatementCallBack(sql));
    }
}
/**
 * <p>内部类 == 用户查询数据库操作对象回调类</p>
 */
class GoodsQueryStatementCallBack implements StatementCallback {
    private String sql;
    public GoodsQueryStatementCallBack(String sql) {
        this.sql = sql;
    }
    @Override
    public Object doInStatement(Statement stmt) throws SQLException {
        System.out.println("执行SQL语句:" + sql);
        System.out.println("数据集处理成功,返回Goods数据实体对象");
        return null;
    }
}

3.数据库操作模板类

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * <p>数据库操作模板类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class JdbcTemplate {
    public final Object execute(StatementCallback callback) throws SQLException {
        // 1、首先获取数据库连接对象
        Connection connection = getConnection();
        // 2、根据连接获取statement对象(数据库操作对象)
        Statement stmt = getStament(connection);
        // 3、根据stmt回调子类方法 --> 执行sql语句获取最终结果
        return callback.doInStatement(stmt);
        // 资源的释放这里我就省略了
    }
    private Connection getConnection(){
        System.out.println("获取数据库连接");
        return null;
    }
    private Statement getStament(Connection connection){
        System.out.println("获取数据库操作对象");
        return null;
    }
    public Object executeQuery(StatementCallback callback) throws SQLException{
        return execute(callback);
    }
    /**
     * 如果该类是抽象类,则定义以下四个抽象方法,则其子类必须全部实现
     * 回调的好处,即子类只需要实现父类中的某一个方法即可,该方法可以抽离成一个接口的方法
     */
//    protected abstract void A();
//    protected abstract void B();
//    protected abstract void C();
//    protected abstract void D();
}

4.数据库操作回调接口

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * <p>数据库操作回调接口</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public interface StatementCallback {
    Object doInStatement(Statement stmt) throws SQLException;
}

5.用户查询业务类

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板And回调实现;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * <p>用户查询业务类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class UserQueryServiceImpl{
    public Object query(String sql) throws SQLException{
      return  new JdbcTemplate().executeQuery(new UserQueryStatementCallBack(sql));
    }
}
/**
 * <p>内部类 == 用户查询数据库操作对象回调类</p>
 */
class UserQueryStatementCallBack implements StatementCallback{
    private String sql ;
    public UserQueryStatementCallBack(String sql){
        this.sql = sql;
    }
    @Override
    public Object doInStatement(Statement stmt) throws SQLException {
        System.out.println("执行SQL语句:"+sql);
        System.out.println("数据集处理成功,返回User数据实体对象");
        return null;
    }
}


6.模拟JDB模板类(可以理解为伪代码说明)


package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * <p>模拟JDB模板类(可以理解为伪代码说明)</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public abstract class AbstractJdbcTemplate {
    public final Object execute(String sql) throws SQLException {
        // 1、首先获取数据库连接对象
        Connection connection = getConnection();
        // 2、根据连接获取statement对象(数据库操作对象)
        getStament(connection);
        // 3、使用数据库操作对象来执行对应的SQL语句
        ResultSet rs = executeQuery(sql);
        // 4、最后基于查询的数据集,处理并返回最终结果
        return doInStatement(rs);
        // 资源的释放这里我就省略了
    }
    private Connection getConnection(){
        System.out.println("获取数据库连接");
        return null;
    }
    private Statement getStament(Connection connection){
        System.out.println("获取数据库操作对象");
        return null;
    }
    private ResultSet executeQuery(String sql){
        System.out.println("执行SQL语句:"+sql);
        return null;
    }
    /**
     * <p>基于结果集进行定制,由具体的子类实现</p>
     * @param rs 结果集
     * @return 数据模型对象
     */
    protected abstract Object doInStatement(ResultSet rs) throws SQLException;
}

7.商品数据库操作(模板)实现类

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * <p>商品数据库操作(模板)实现类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class GoodsTemplateImpl extends AbstractJdbcTemplate {
    @Override
    protected Object doInStatement(ResultSet rs) throws SQLException {
        // 遍历数据集
//        while (rs.next()){
//           // dosomething
//        }
        System.out.println("数据集处理成功,返回Goods数据实体对象");
        return null;
    }
}

8.用户数据库操作(模板)实现类

package com.zhaoshuangjian.mode14_模板模式.mode14.JDBC模板方法实现;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * <p>用户数据库操作(模板)实现类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class UserTemplateImpl extends AbstractJdbcTemplate {
    @Override
    protected Object doInStatement(ResultSet rs) throws SQLException {
        // 遍历数据集
//        while (rs.next()){
//           // dosomething
//        }
        System.out.println("数据集处理成功,返回User数据实体对象");
        return null;
    }
}

9.定义抽象算法类

package com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤;
/**
 * <p>定义抽象算法类</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public abstract class AbstractCalculator {
    public final double calculate(String formula , String splitChar){
        // 1、第一步,先根据计算公式和分隔符,拿到要计算的数值(假设这个是核心,不对外公布)
        double[] splitArry = split(formula, splitChar);
        // 2、第二步,各个算法类代表发个言吧(默认不发言的,一律按父类说的来)
        hookSay();
        // 3、第三步,话说完了,各个算法(子)类开始干活吧(这时候别再指望父类帮你默认实现了,休想!)
        return calculate(splitArry[0], splitArry[1]);
    }
    /**
     * <p>根据字符分割公式,提取double数组</p>
     * @param formula 计算公式
     * @param splitChar 分隔字符
     * @return double数组
     */
    private double[] split(String formula , String splitChar){
        String array[] = formula.trim().split(splitChar);
        double arrayDouble[] = new double[2];
        arrayDouble[0] = Double.parseDouble(array[0]);
        arrayDouble[1] = Double.parseDouble(array[1]);
        return arrayDouble;
    }
    /**
     * <p>公开(钩子)方法,子类和父类进行信息交互,子类可以使用默认的父类方法,也可以重写改方法</p>
     */
    public void hookSay(){
        System.out.println("父类说:算法步骤的顺序我已经定好了,尔等子类照着做就行!");
    }
    /**
     * <p>根据a和b的值计算结果,这个必须由子类来实现,父类帮不了了</p>
     * @param numA 第一个数字
     * @param numB 第二个数字
     * @return 两个数字计算的结果
     */
    protected abstract double calculate(double numA ,double numB);
}

10.加法运算

package com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤;
/**
 * <p>加法运算</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class Plus extends AbstractCalculator{
    @Override
    protected double calculate(double numA, double numB) {
        return numA + numB ;
    }
    /**
     * 重写父类钩子方法
     */
    @Override
    public void hookSay() {
        System.out.println("子类Plus说:接下来,由我来计算结果!");
    }
}

11.减法运算

package com.zhaoshuangjian.mode14_模板模式.mode14.父类固定算法步骤;
/**
 * <p>减法运算</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class Sub extends AbstractCalculator{
    @Override
    protected double calculate(double numA, double numB) {
        return numA - numB ;
    }
}
相关文章
|
19天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
21天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
14天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
36 1
|
1月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
22 3
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
33 8
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。