模板模式一般又叫模板方法模式(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;