设计模式之模板模式

本文探讨了模板模式和策略模式的区别,通过JdbcTemplate的例子详细解释了模板模式的实现方式,包括采用抽象方法和接口方式实现。模板模式允许子类在不改变算法结构的情况下重定义算法的某些步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板模式又名模板方法模式。
  定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变 一个算法的结构即可重定义该算法的某些特定步骤。 TemplateMethod 模式一般是需要继承的。

和策略模式对比:


策略模式:只有选择权(由用户自己选择已有的固定算法)
模板模式:侧重点不是选择,你没有选择,你必须这么做,你可以参与某一部分内容自定义

1. 采用 普通的抽象方法实现

通过Java中得JdbcTemplate例子来解析

1)实体类:

package com.vison.template.dao;
public class Member {
    private String userName;
    private String password;
    private int age;
...get set 方法省略
}

2)JdbcTemplate定义为抽象类,使用模板方法

package com.vison.template;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public abstract class JdbcTemplate {

    private DataSource dataSource;

    public JdbcTemplate(DataSource dataSource){
        this.dataSource=dataSource;
    }

    public List<Object> executeQuery(String sql , Object[] values) throws Exception{

        //创建连接
        Connection connection = dataSource.getConnection();
        //创建语句集
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //执行语句集,返回结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        //解析结果集
        List<Object> result = new ArrayList<Object>();
        while (resultSet.next()){
            result.add(processResultSet(resultSet));
        }
        //List<?> result = this.processResultSet(resultSet);
        //关闭结果集连接
        resultSet.close();
        //关闭语句集连接
        preparedStatement.close();
        //回收数据库连接
        connection.close();
        //返回结果
        return result;
    }

    //模板方法
    public abstract Object processResultSet(ResultSet rs) throws Exception;
}

3) JdbcTemplate 子类 MemberDAO ,重写模板方法

package com.vison.template.dao;

import com.vison.template.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.util.List;

public class MemberDAO extends JdbcTemplate {

    public MemberDAO(DataSource dataSource){
        super(dataSource);
    }

    public List<Object> query(String sql, Object[] values)throws Exception{
       return super.executeQuery(sql,values);
    }

	//重写模板方法,可以定义多个子类,来自定义实现这个方法的设置
    @Override
    public Object processResultSet(ResultSet rs) throws Exception {
        Member member = new Member();
        member.setUserName(rs.getString("userName"));
        member.setPassword(rs.getString("password"));
        member.setAge(rs.getInt("age"));
        return member;
    }
}

4) 测试

package com.vison.template;

import com.vison.template.dao.MemberDAO;

import java.util.List;

public class TestJdbcTemplate {

    public static void main(String[] args) throws Exception {

        MemberDAO memberDAO = new MemberDAO(null);
        String sql = "select * from t_user";
        List<Object> result = memberDAO.query(sql, null);
    }
}

2. 采用接口的方式实现

  上面通过继承的方式来实现模板方法的重写,这里可以采用组合的方式;抽象方法可以用接口来实现。
  这种方式采用匿名内部类来实现,就可以减少子类的新建,而且采用组合方式也解耦。优化代码如下

如下:

1) 同样的Member实体类
2) 新建一个接口RowMapper

package com.vison.template.dao;

import java.sql.ResultSet;
import java.util.List;

public interface RowMapper<T> {

   T processResult (ResultSet resultSet) throws Exception;
}

3) JdbcTemplate改写

package com.vison.template;

import com.vison.template.dao.RowMapper;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public  class JdbcTemplate {

    private DataSource dataSource;

    public JdbcTemplate(DataSource dataSource){
        this.dataSource=dataSource;
    }

    //这里传进一个RowMapper接口更灵活使用
    public List<Object> executeQuery(RowMapper rowMapper,String sql , Object[] values) throws Exception{

        //创建连接
        Connection connection = this.getConnection();
        //创建语句集
        PreparedStatement preparedStatement = this.getPreparedStatement(sql, connection);
        //执行语句集,返回结果集
        ResultSet resultSet = this.getResultSet(preparedStatement);
        //解析结果集
        List<Object> result = this.parseResultSet(rowMapper, resultSet);
        //关闭结果集连接
        this.resultSetClose(resultSet);
        //关闭语句集连接
        this.preparedStatementClose(preparedStatement);
        //使用连接池 回收数据库连接
        this.connClose(connection);
        //返回结果
        return result;
    }

    private void connClose(Connection connection) throws SQLException {
        connection.close();
    }

    private void preparedStatementClose(PreparedStatement preparedStatement) throws SQLException {
        preparedStatement.close();
    }

    private void resultSetClose(ResultSet resultSet) throws SQLException {
        resultSet.close();
    }

    private List<Object> parseResultSet(RowMapper rowMapper, ResultSet resultSet) throws Exception {
        List<Object> result = new ArrayList<Object>();
        while (resultSet.next()){
            result.add(rowMapper.processResult(resultSet));
        }
        return result;
    }

    private ResultSet getResultSet(PreparedStatement preparedStatement) throws SQLException {
        return preparedStatement.executeQuery();
    }

    private PreparedStatement getPreparedStatement(String sql, Connection connection) throws SQLException {
        return connection.prepareStatement(sql);
    }

    private Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

4) 改写MemberDAO,组合方式

package com.vison.template.dao;

import com.vison.template.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.util.List;

public class MemberDAO  {
    private DataSource dataSource;

    private JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    public MemberDAO(DataSource dataSource){
        this.dataSource = dataSource;
    }

    public List<Object> query(String sql, Object[] values)throws Exception{

        //这里用匿名内部类来实现,就不用每次新建一个模板方法的实现类
       return jdbcTemplate.executeQuery(new RowMapper<Member>() {
           public Member processResult(ResultSet rs) throws Exception {
               Member member = new Member();
               member.setUserName(rs.getString("userName"));
               member.setPassword(rs.getString("password"));
               member.setAge(rs.getInt("age"));
               return member;
           }
       },sql,values);
    }
}

标题SpringBoot基于Web的图书借阅管理信息系统设计与实现AI更换标题第1章引言介绍图书借阅管理信息系统的研究背景、意义、现状以及论文的研究方法和创新点。1.1研究背景与意义分析当前图书借阅管理的需求和SpringBoot技术的应用背景。1.2国内外研究现状概述国内外在图书借阅管理信息系统方面的研究进展。1.3研究方法与创新点介绍本文采用的研究方法和系统设计的创新之处。第2章相关理论技术阐述SpringBoot框架、Web技术和数据库相关理论。2.1SpringBoot框架概述介绍SpringBoot框架的基本概念、特点和核心组件。2.2Web技术基础概述Web技术的发展历程、基本原理和关键技术。2.3数据库技术应用讨论数据库在图书借阅管理信息系统中的作用和选型依据。第3章系统需求分析对图书借阅管理信息系统的功能需求、非功能需求进行详细分析。3.1功能需求分析列举系统应具备的各项功能,如用户登录、图书查询、借阅管理等。3.2非功能需求分析阐述系统应满足的性能、安全性、易用性等方面的要求。第4章系统设计详细介绍图书借阅管理信息系统的设计方案和实现过程。4.1系统架构设计给出系统的整体架构,包括前后端分离、数据库设计等关键部分。4.2功能模块设计具体阐述各个功能模块的设计思路和实现方法,如用户管理模块、图书管理模块等。4.3数据库设计详细介绍数据库的设计过程,包括表结构、字段类型、索引等关键信息。第5章系统实现与测试对图书借阅管理信息系统进行编码实现,并进行详细的测试验证。5.1系统实现介绍系统的具体实现过程,包括关键代码片段、技术难点解决方法等。5.2系统测试给出系统的测试方案、测试用例和测试结果,验证系统的正确性和稳定性。第6章结论与展望总结本文的研究成果,指出存在的问题和未来的研究方向。6.1研究结论概括性地总结本文的研究内容和取得的成果。6.2展望对图书借阅管理
摘 要 基于SpringBoot的电影院售票系统为用户提供了便捷的在线购票体验,覆盖了从注册登录到观影后的评价反馈等各个环节。用户能够通过系统快速浏览和搜索电影信息,包括正在热映及即将上映的作品,并利用选座功能选择心仪的座位进行预订。系统支持多种支付方式如微信、支付宝以及银行卡支付,同时提供积分兑换和优惠券领取等功能,增强了用户的购票体验。个人中心允许用户管理订单、收藏喜爱的影片以及查看和使用优惠券,极大地提升了使用的便利性和互动性。客服聊天功能则确保用户在遇到问题时可以即时获得帮助。 后台管理人员,系统同样提供了全面而细致的管理工具来维护日常运营。管理员可以通过后台首页直观地查看销售额统计图,了解票房情况并据此调整策略。电影信息管理模块支持新增、删除及修改电影资料,确保信息的准确与及时更新。用户管理功能使得管理员可以方便地处理用户账号,包括导入导出数据以供分析。订单管理模块简化了对不同状态订单的处理流程,提高了工作效率。优惠券管理和弹窗提醒管理功能有助于策划促销活动,吸引更多观众。通过这样的集成化平台,SpringBoot的电影院售票系统不仅优化了用户的购票体验,也加强了影院内部的管理能力,促进了业务的发展和服务质量的提升。 关键词:电影院售票系统;SpringBoot框架;Java技术
内容概要:本文介绍了2025年中国网络安全的十大创新方向,涵盖可信数据空间、AI赋能数据安全、ADR(应用检测与响应)、供应链安全、深度伪造检测、大模型安全评估、合规管理与安全运营深度融合、AI应用防火墙、安全运营智能体、安全威胁检测智能体等。每个创新方向不仅提供了推荐的落地方案和典型厂商,还详细阐述了其核心能力、应用场景、关键挑战及其用户价值。文中特别强调了AI技术在网络安全领域的广泛应用,如AI赋能数据安全、智能体驱动的安全运营等,旨在应对日益复杂的网络威胁,提升企业和政府机构的安全防护能力。 适合人群:从事网络安全、信息技术、数据管理等相关工作的专业人士,尤其是负责企业信息安全、技术架构设计、合规管理的中高层管理人员和技术人员。 使用场景及目标:①帮助企业理解和应对最新的网络安全威胁和技术趋势;②指导企业选择合适的网络安全产品和服务,提升整体安全防护水平;③协助企业构建和完善自身的网络安全管理体系,确保合规运营;④为技术研发人员提供参考,推动技术创新和发展。 其他说明:文章内容详尽,涉及多个技术领域和应用场景,建议读者根据自身需求重点关注相关章节,并结合实际情况进行深入研究和实践。文中提到的多个技术和解决方案已在实际应用中得到了验证,具有较高的参考价值。此外,随着技术的不断发展,文中提及的部分技术和方案可能会有所更新或改进,因此建议读者保持关注最新的行业动态和技术进展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值