设计模式(十七)——模板方法模式

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 }
原文地址:https://www.cnblogs.com/cxy2016/p/7670370.html