1. 程式人生 > >設計模式(十七)——模板方法模式

設計模式(十七)——模板方法模式

ring next pri cut 限制 pack [] eat 模式

1.描述

定義一個操作中算法的骨架,而將一些步驟延伸到子類當中。模板方法使子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

2.模式的使用

·抽象模板(Abstract Template):抽象模板是一個抽象類。抽象模板定義若幹方法表示一個算法的各個步驟,這些算法中有抽象方法也有非抽象方法,其中抽象方法稱作原語操作(Primitive Operation)。重要的一點是,抽象模板中還定義了一個稱作模板方法的方法,該方法不僅包含有抽象模板中表示算法步驟的方法調用,而且也可以包含有定義在抽象模板中的其他對象的方法調用,及模板方法定義了算法的骨架。

·具體模板(Concrete Template)

:具體模板是抽象模板的子類,實現抽象模板中的原語操作。

3.使用情景

·設計者需要給出一個算法的固定步驟,並將某些步驟的具體實現留給子類。

·需要對代碼重構,可以通過鉤子方法對某些步驟進行掛鉤,具體模板通過鉤子可以選擇算法骨架中的某些步驟。

4.優點

·可通過在抽象模板定義模板方法給出成熟的算法步驟,同時不限制步驟的細節,具體模板實現算法細節不會改變整個算法骨架。

·通過鉤子方法對某些步驟進行掛鉤,可以選擇算法骨架中的某些步驟。

5.UML

技術分享

6案例

 1 package 模板方式;
 2 
 3 import java.sql.*;
 4 
 5 public class test1 {
6 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 10 } 11 12 } 13 14 abstract class OperationDatabase{ 15 Connection con; 16 Statement sql; 17 ResultSet rs; 18 String dataBase, tableName; 19 20 OperationDatabase(String dataBase, String tableName){
21 this.dataBase = dataBase; 22 this.tableName = tableName; 23 } 24 25 public final void lookResult(){ 26 27 } 28 29 public abstract void loadDriver(); 30 31 public abstract void creatConnection(); 32 33 public final void creatStatement(){ 34 try{ 35 sql = con.createStatement(); 36 }catch(SQLException e){ 37 e.printStackTrace(); 38 } 39 } 40 41 public final void handleResult(){ 42 try{ 43 DatabaseMetaData metaData = con.getMetaData(); 44 ResultSet rs1 = metaData.getColumns(null, null, tableName, null); 45 int numberOfField = 0; 46 while(rs.next()){ 47 numberOfField++; 48 System.out.printf("%-15s", rs1.getString(4)); 49 } 50 System.out.println(); 51 rs = sql.executeQuery("select *from" + tableName); 52 while(rs.next()){ 53 for(int i = 0; i <= numberOfField; i++) 54 System.out.printf("%-15s", rs.getString(i)); 55 System.out.println(); 56 } 57 con.close(); 58 }catch(Exception e){ 59 e.printStackTrace(); 60 } 61 } 62 } 63 64 class OperationAccessDatabase extends OperationDatabase{ 65 66 OperationAccessDatabase(String dataBase, String tableName) { 67 super(dataBase, tableName); 68 // TODO Auto-generated constructor stub 69 } 70 71 @Override 72 public void loadDriver() { 73 try { 74 Class.forName(""); 75 } catch (ClassNotFoundException e) { 76 // TODO Auto-generated catch block 77 e.printStackTrace(); 78 } 79 80 } 81 82 @Override 83 public void creatConnection() { 84 // TODO Auto-generated method stub 85 86 } 87 88 }

設計模式(十七)——模板方法模式