模板方法模式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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+")"); } }
模式的结构中包括两种角色: •抽象模板(Abstract Template) •具体模板(Concrete Template)
2015-3-26
3
模式的UML类图
2015-3-26
4
模式的结构的描述与使用 1.抽象模板(Abstract Template): AbstractTemplate.java
import java.io.*; public abstract class AbstractTemplate{ File [] allFiles; File dir; AbstractTemplate(File dir){ this.dir=dir; } public final void showFileName(){ allFiles=dir.listFiles(); sort(); printFiles(); } public abstract void sort(); public abstract void printFiles(); 2015-3-26 }
第二十一章
模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到 子类中。模板方法使得子类可以不改变一个算法的结构 即可重定义该算法的某些特定步骤。
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.
•可以通过在抽象模板定义模板方法给出成熟的算法步骤,
同时又不限制步骤的细节,具体模板实现算法细节不会 改变整个算法的骨架。
•在抽象模板模式中,可以通过钩子方法对某些步骤进行
挂钩,具体模板通过钩子可以选择算法骨架中的某些步 骤。
2015-3-26
9
四、钩子方法
• 抽象模板中定义的具体方法,给出了空实 现或默认的实现。 • 允许子类重写这个具体方法。
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); } }}
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 }
6Leabharlann Baidu
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; }
2015-3-26
1
一 、 概述
模板方法是关于怎样将若干个方法集成 到一个方法中,以便形成一个解决问题的算 法骨架。模板方法模式的关键是在一个抽象 类中定义一个算法的骨架,即将若干个方法 集成到一个方法中,并称该方法为一个模板 方法,或简称为模板。
2015-3-26
2
二、模板方法模式的结构与使用
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()+"目录下的文件:");
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(); }
template.showFileName();
template=new ConcreteTemplate2(dir); System.out.println(dir.getPath()+"目录下的文件:"); template.showFileName(); } }
2015-3-26
8
三、模板方法模式的优点
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); } }}
}
public void printFiles(){ for(int i=0;i<allFiles.length;i++){ long fileSize=allFiles[i].length() ; String name=allFiles[i].getName(); int k=i+1; System.out.println(k+" "+name+"("+fileSize+" 字节)"); } } }
public abstract void loadDriver(); public abstract void createConnection(); public final void createStatement(){ try{ sql=con.createStatement(); } catch(SQLException e){ System.out.println(e); } }
5
2.具体模板(Concrete Template)_1: ConcreteTemplate1.java
public class ConcreteTemplate1 extends AbstractTemplate{ ConcreteTemplate1(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].lastModified()<allFiles[i].lastModified()){ File file=allFiles[j]; allFiles[j]=allFiles[i];