模板方法
定義一個(gè)操作算法的骨架,而將一些步驟沿遲到子類中去實(shí)現(xiàn),模板方法使了類可能不改變算法的結(jié)構(gòu)即可以重定義該算法的某一些特定步驟.
組成部份
1.抽象模板 是一個(gè)抽象類,包含一系列的算法和一個(gè)模板方法,模板方法需要加final來修飾.
2.具體模板 繼承自抽象類.
各組成部份之間的關(guān)系

適用場(chǎng)景:
設(shè)計(jì)者需要給出一個(gè)算法的固定步驟,并將某一些步驟的具體實(shí)現(xiàn)留給子類來實(shí)現(xiàn).
需要對(duì)代碼進(jìn)行重構(gòu),將各個(gè)子類的公共行為取出來放到一個(gè)共同的父親類中以避免代碼重復(fù)
例子:
1.抽象模板
package template;

/**
* <ul>
* <li>Title:[AbstractTemplate]</li>
* <li>Description: [抽象模板]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public abstract class DatabaseExecuteTemplate
{
/**
* <ul>
* <li>Description:[加載驅(qū)動(dòng)]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void loadDrive();
/**
* <ul>
* <li>Description:[連接數(shù)據(jù)庫]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void connectDataBase();
/**
* <ul>
* <li>Description:[創(chuàng)建statement]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void createStatement();
/**
* <ul>
* <li>Description:[執(zhí)行sql]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void executeSQL(String sql);
/**
* <ul>
* <li>Description:[關(guān)閉statement]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void closeStatement();
/**
* <ul>
* <li>Description:[關(guān)閉連接]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public abstract void closeConnect();
/**
* <ul>
* <li>Description:[是否刷新勾子]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @return
*/
public abstract boolean isFresh();
/**
* <ul>
* <li>Description:[刷新]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @return
*/
public abstract void fresh();
/**
* <ul>
* <li>Description:[執(zhí)行sql]</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @param sql
*/
public final void exceute(String sql)
{
// 加載驅(qū)動(dòng)
this.loadDrive();
// 連接數(shù)據(jù)庫
this.connectDataBase();
// 創(chuàng)建statement
this.createStatement();
// 執(zhí)行sql
this.executeSQL(sql);
//關(guān)閉statement
this.closeStatement();
// 關(guān)系連接
this.closeConnect();
// 使用勾子改變算法
if(isFresh())
{
// 刷新操作
this.fresh();
}
}
}

2.具體模板1
package template;

/**
* <ul>
* <li>Title:[OracleExecuteTemple]</li>
* <li>Description: [oracle模板]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class OracleExecuteTemple extends DatabaseExecuteTemplate
{
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#closeConnect()
*/
public void closeConnect()
{
// TODO Auto-generated method stub
System.out.println("oracle 關(guān)閉連接");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#closeStatement()
*/
public void closeStatement()
{
// TODO Auto-generated method stub
System.out.println("oracle 關(guān)閉statement");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#connectDataBase()
*/
public void connectDataBase()
{
// TODO Auto-generated method stub
System.out.println("oracle 連接數(shù)據(jù)庫");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#createStatement()
*/
public void createStatement()
{
// TODO Auto-generated method stub
System.out.println("oracle 創(chuàng)建statement");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#executeSQL()
*/
public void executeSQL(String sql)
{
// TODO Auto-generated method stub
System.out.println("oracle 執(zhí)行SQL: " + sql);
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#fresh()
*/
public void fresh()
{
System.out.println("oracle 刷新");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#isFresh()
*/
public boolean isFresh()
{
return false;
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#loadDrive()
*/
public void loadDrive()
{
System.out.println("oracle 加載驅(qū)動(dòng)");
}
}

3.具體模板2
package template;

/**
* <ul>
* <li>Title:[DB2ExecuteTemple]</li>
* <li>Description: [DB2模板]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-2]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class DB2ExecuteTemple extends DatabaseExecuteTemplate
{
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#closeConnect()
*/
public void closeConnect()
{
// TODO Auto-generated method stub
System.out.println("DB2 關(guān)閉連接");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#closeStatement()
*/
public void closeStatement()
{
// TODO Auto-generated method stub
System.out.println("DB2 關(guān)閉statement");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#connectDataBase()
*/
public void connectDataBase()
{
// TODO Auto-generated method stub
System.out.println("DB2 連接數(shù)據(jù)庫");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#createStatement()
*/
public void createStatement()
{
// TODO Auto-generated method stub
System.out.println("DB2 創(chuàng)建statement");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#executeSQL()
*/
public void executeSQL(String sql)
{
// TODO Auto-generated method stub
System.out.println("DB2 執(zhí)行SQL: " + sql);
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#fresh()
*/
public void fresh()
{
System.out.println("DB2 刷新");
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#isFresh()
*/
public boolean isFresh()
{
return true;
}
/*
* (non-Javadoc)
*
* @see template.DatabaseExecuteTemplate#loadDrive()
*/
public void loadDrive()
{
System.out.println("DB2 加載驅(qū)動(dòng)");
}
}

4.測(cè)試類
package template;

public class Test
{
public static void main(String[] args)
{
DatabaseExecuteTemplate db2 = new DB2ExecuteTemple();
db2.exceute("select count(*) from users");
OracleExecuteTemple oracle = new OracleExecuteTemple();
oracle.exceute("select count(*) from users");
}
}

定義一個(gè)操作算法的骨架,而將一些步驟沿遲到子類中去實(shí)現(xiàn),模板方法使了類可能不改變算法的結(jié)構(gòu)即可以重定義該算法的某一些特定步驟.
組成部份
1.抽象模板 是一個(gè)抽象類,包含一系列的算法和一個(gè)模板方法,模板方法需要加final來修飾.
2.具體模板 繼承自抽象類.
各組成部份之間的關(guān)系

適用場(chǎng)景:
設(shè)計(jì)者需要給出一個(gè)算法的固定步驟,并將某一些步驟的具體實(shí)現(xiàn)留給子類來實(shí)現(xiàn).
需要對(duì)代碼進(jìn)行重構(gòu),將各個(gè)子類的公共行為取出來放到一個(gè)共同的父親類中以避免代碼重復(fù)
例子:
1.抽象模板






























































































































2.具體模板1









































































































3.具體模板2








































































































4.測(cè)試類













