模板模式

Posted xianquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板模式相关的知识,希望对你有一定的参考价值。

  模板模式邮件模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式使模板使用于以下场景:

  (1)一次性实现一个算法的不变部分,并将可变部分的行为留给子类类实现。

  (2)各子类中公共的行为呗提取出来并集到一个公共的父类中,从而避免代码重复。

利用模板模式重构JDBC操作业务场景

  创建一个模板类 jdbcTemplate 封装所有的 JDBC 操作。以查询为例,每次查询的表不同,返回的数据结构也就不一样。我们针对不同的数据,都要将其封装成不同的实体对象。而每个实体对象的封装逻辑是不一样的,但封装前和封装后的处理流程是不变的,因此可以使用模板模式来进行设计。先创建约束 ORM 逻辑的接口 RowMapper:

package com.xq.design.template;

import java.sql.ResultSet;

public interface RowMapper<T> {
    T mapRow(ResultSet rs, int rowNum) throws Exception;
}

  再创建封装了所有处理流程的抽象类 JdbcTemlate :

技术图片
package com.xq.design.template.jdbc;

import com.xq.design.template.RowMapper;

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<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values){
        try{
            //获取连接
            Connection conn = this.getConnection();
            //创建语句
            PreparedStatement pstm = this.createPropareStatement(conn,sql);
            //执行语句集
            ResultSet rs = this.executedQuery(pstm,values);
            //处理结果集
            List<?> result = this.paresResultSet(rs,rowMapper);
            //关闭结果集
            this.closeResultSet(rs);
            //关闭语句集
            this.closeStatement(pstm);
            //关闭连接
            this.closeConnection(conn);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    protected void closeConnection(Connection conn) throws Exception{
        conn.close();
    }
    protected void closeStatement(PreparedStatement pstm) throws Exception{
        pstm.close();
    }
    protected void closeResultSet(ResultSet rs) throws  Exception{
        rs.close();
    }
    protected List<?> paresResultSet(ResultSet rs, RowMapper<?> rowMapper ) throws Exception{
        List<Object> result = new ArrayList<Object>();
        int rowNum = 1;
        while(rs.next()){
            result.add(rowMapper.mapRow(rs,rowNum ++));
        }
        return result;
    }
    protected ResultSet executedQuery(PreparedStatement pstm,Object[] values) throws Exception{
        for(int i = 0; i < values.length; i++){
            pstm.setObject(i,values[i]);
        }
        return pstm.executeQuery();
    }
    protected PreparedStatement createPropareStatement(Connection conn, String sql) throws Exception{
        return conn.prepareStatement(sql);
    }

    public Connection getConnection() throws Exception{
        return this.dataSource.getConnection();
    }
}
JdbcTemplate

  创建实体对象类 Member:

package com.xq.design.template.entity;

import lombok.Data;

@Data
public class Member {
    private String userName;
    private String passWord;
    private String nickName;

    private int age;
    private String addr;
}

  创建数据库操作类 MemberDao:

package com.xq.design.template.jdbc.dao;

import com.xq.design.template.RowMapper;
import com.xq.design.template.entity.Member;
import com.xq.design.template.jdbc.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<?> selectAll(){
        String sql = "select * from t_member";
        return super.executeQuery(sql, new RowMapper<Member>() {
            public Member mapRow(ResultSet rs, int rowNum) throws Exception{
                Member member = new Member();
                member.setUserName(rs.getString("userName"));
                member.setPassWord(rs.getString("passWord"));
                member.setAge(rs.getInt("age"));
                member.setAddr(rs.getString("addr"));
                return member;
            }
        },null);
    }
}

  客户端测试代码如下:

package com.xq.design.template.jdbc;

import com.xq.design.template.jdbc.dao.MemberDao;

import java.util.List;

public class MemberDaoTest {
    public static void main(String[] args) {
        MemberDao memberDao = new MemberDao(null);
        List<?> result = memberDao.selectAll();
        System.out.println(result);
    }
}

 

以上是关于模板模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

Eclipse 中的通用代码片段或模板

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

vscode代码片段生成vue模板