模板方法模式
模式的结构中包括两种角色: •抽象模板(Abstract Template) •具体模板(Concrete Template)
2015-3-26
3
模式的UML类图
2015-3-26
4
模式的结构的描述与使用 1.抽象模板(Abstract Template): AbstractTemplate.java
import java.sql.*; public class OperationAccessDatabase extends OperationDatabase{ OperationAccessDatabase(String dataBase,String tableName){ super(dataBase,tableName); } public void loadDriver(){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException e){ System.out.println(""+e); } } public void createConnection(){ try{ String str="jdbc:odbc:"+dataBase; String user=""; String password=""; con=DriverManager.getConnection(str,user,password); } catch(SQLException exp){ System.out.println(""+exp);
2015-3-26
1
一 、 概述
模板方法是关于怎样将若干个方法集成 到一个方法中,以便形成一个解决问题的算 法骨架。模板方法模式的关键是在一个抽象 类中定义一个算法的骨架,即将若干个方法 集成到一个方法中,并称该方法为一个模板 方法,或简称为模板。
allFiles[i]=file;
} } public void printFiles(){ for(int i=0;i<allFiles.length;i++){ long time=allFiles[i].lastModified(); Date date=new Date(time); SimpleDateFormat matter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str=matter.format(date); String name=allFiles[i].getName(); int k=i+1; System.out.println(k+" "+name+"("+str+")"); } }
public final void handleResult(){ try { DatabaseMetaData metadata=con.getMetaData(); ResultSet rs1=metadata.getColumns(null,null,tableName,null); int 字段个数=0; while(rs1.next()){ 字段个数++; System.out.printf("%-15s",rs1.getString(4)); } System.out.println(); rs=sql.executeQuery("SELECT * FROM "+tableName); while(rs.next()){ for(int k=1;k<=字段个数;k++){ System.out.printf("%-15s",rs.getString(k)); } System.out.println(); } con.close(); } catch(SQLException e){ System.out.println(e); } }}
template.showFileName();
template=new ConcreteTemplate2(dir); System.out.println(dir.getPath()+"目录下的文件:"); template.showFileName(); } }
2015-3-26
8
三、模板方法模式的优点
public abstract void loadDriver(); public abstract void createConnection(); public final void createStatement(){ try{ sql=con.createStatement(); } catch(SQLException e){ System.out.println(e); } }
•可以通过在抽象模板定义模板方法给出成熟的算法步骤,
同时又不限制步骤的细节,具体模板实现算法细节不会 改变整个算法的骨架。
•在抽象模板模式中,可以通过钩子方法对某些步骤进行
挂钩,具体模板通过钩子可以选择算法骨架中的某些步 骤。
2015-3-26
9
四、钩子方法
• 抽象模板中定义的具体方法,给出了空实 现或默认的实现。 • 允许子类重写这个具体方法。
第二十一章
模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到 子类中。模板方法使得子类可以不改变一个算法的结构 即可重定义该算法的某些特定步骤。
Template Method Pattern Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
Java Applet
• Applet有5个public的void方法(Applet的生 命周期):
– init() – start() – paint(Graphics g) – stop() – destory()
五、数据库的连接与记录查询
public abstract class OperationDatabase{ Connection con; Statement sql; ResultSet rs; String dataBase,tableName; OperationDatabase(String dataBase,String tableName){ this.dataBase=dataBase; this.tableName=tableName; } public final void lookResult(){ loadDriver(); createConnection(); createStatement(); handleResult(); }
2015-3-26
7
3.应用 Application.java
import java.io.File; public class Application{
public static void main(String args[]) {
File dir=new File("d:/javaExample"); AbstractTemplate template=new ConcreteTemplate1(dir); System.out.println(dir.getPath()+"目录下的文件:");
2015-3-26 }
6
2.具体模板(Concrete Template)_2:ConcreteTemplate2.java
public class ConcreteTemplate2 extends AbstractTemplate{ ConcreteTemplate2(File dir){ super(dir); } public void sort(){ for(int i=0;i<allFiles.length;i++) for(int j=i+1;j<allFiles.length;j++) if(allFiles[j].length()<allFiles[i].length()){ File file=allFiles[j]; allFiles[j]=allFiles[i]; allFiles[i]=file; }
import java.sql.*; public class OperationSQLServerDatabase extends OperationDatabase{ OperationSQLServerDatabase(String dataBase,String tableName){ super(dataBase,tableName); } public void loadDriver(){ try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch(ClassNotFoundException e){ System.out.println(""+e); } } public void createConnection(){ try{ String uri="jdbc:sqlserver://127.0.0.1:1433;DatabaseName="+dataBase; String user="sa"; String password="sa"; con=DriverManager.getConnection(uri,user,password); } catch(SQLException exp){ System.out.println(""+exp); } }}