模板模式

模板模式一般又叫模板方法模式(Template MethodPattern)是指定義一個算法的骨架,並容許子類爲一個或者多個步驟提供實現。java

模板方法使得子類能夠在不改變算法結構的狀況下,從新定義算法的某些步驟。算法

屬於行爲性設計模式sql

適用場景: 1 一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現。數據庫

                2 各子類中公共的行爲被提取出來並集中到一個公共的父類中,從而避免代碼重複。設計模式

優勢:  1 提升代碼的複用性 架構

          2 提升代碼的擴展性app

          3 符合開閉原則ide

缺點: 1 類數目的增長post

         2 間接地增長了系統實現的複雜度大數據

         3  繼承關係自身缺點,若是父類添加新的抽象方法,全部子類都要改一遍

/**
 * 模板會有一個或者多個未現實方法,
 * 並且這幾個未實現方法有固定的執行循序
 */
public abstract class NetworkCourse {

    protected final void createCourse(){
        //一、發佈預習資料
        this.postPreResource();

        //二、製做PPT課件
        this.createPPT();

        //三、在線直播
        this.liveVideo();

        //四、提交課件、課堂筆記
        this.postNote();

        //五、提交源碼
        this.postSource();

        //六、佈置做業,有些課是沒有做業,有些課是有做業的
        //若是有做業的話,檢查做業,若是沒做業,完成了
        if(needHomework()){
            checkHomework();
        }
    }

    abstract void checkHomework();

    //鉤子方法:實現流程的微調
    protected boolean needHomework(){return false;}

    final void postSource(){
        System.out.println("提交源代碼");
    }

    final void postNote(){
        System.out.println("提交課件和筆記");
    }

    final void liveVideo(){
        System.out.println("直播授課");
    }

    final void createPPT(){
        System.out.println("建立備課PPT");
    }

    final void postPreResource(){
        System.out.println("分發預習資料");
    }

}
public class JavaCourse extends NetworkCourse {
    void checkHomework() {
        System.out.println("檢查Java的架構課件");
    }
}
public class BigDataCourse extends NetworkCourse {

    private boolean needHomeworkFlag = false;

    public BigDataCourse(boolean needHomeworkFlag) {
        this.needHomeworkFlag = needHomeworkFlag;
    }

    void checkHomework() {
        System.out.println("檢查大數據的課後做業");
    }

    @Override
    protected boolean needHomework() {
        return this.needHomeworkFlag;
    }
}
public static void main(String[] args) {

    System.out.println("---Java架構師課程---");
    NetworkCourse javaCourse = new JavaCourse();
    javaCourse.createCourse();

    System.out.println("---大數據課程---");
    NetworkCourse bigDataCourse = new BigDataCourse(true);
    bigDataCourse.createCourse();

}

JDBC:

public interface RowMapper<T> {
    T mapRow(ResultSet rs,int rowNum) throws Exception;
}
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.createPrepareStatement(conn,sql);
            //三、執行語句集
            ResultSet rs = this.executeQuery(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 executeQuery(PreparedStatement pstm, Object[] values) throws Exception {
        for (int i = 0; i < values.length; i++) {
            pstm.setObject(i,values[i]);
        }
        return pstm.executeQuery();
    }

    protected PreparedStatement createPrepareStatement(Connection conn, String sql) throws Exception {
        return conn.prepareStatement(sql);
    }

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

    private String username;
    private String password;
    private String nickname;
    private int age;
    private String addr;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}
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>() {

            @Override
            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);
    }
}
public static void main(String[] args) {
    MemberDao memberDao = new MemberDao(null);
    List<?> result = memberDao.selectAll();
    System.out.println(result);
}

源碼: AbstractList 的 

abstract public E get(int index);
GenericServlet的
public abstract void service(ServletRequest req, ServletResponse res)
BaseExecutor的
protected abstract int doUpdate(MappedStatement ms, Object parameter)
    throws SQLException;

protected abstract List<BatchResult> doFlushStatements(boolean isRollback)
    throws SQLException;

protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)
    throws SQLException;

protected abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)
    throws SQLException;
相關文章
相關標籤/搜索