1. 程式人生 > >設計模式之模板方法模式(行為型)

設計模式之模板方法模式(行為型)

目錄

一、模式定義

模板方法模式就是在一個抽象類中定義一些骨架方法,然後通過類繼承的方法,將一些方法延遲到繼承類裡。模板方法模式是一種類行為型模式,是一種比較常用的方法。不屬於物件行為型模式,因為只是通過類繼承實現。

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.

二、模式角色

  • AbstractClass(抽象類)
  • ConcreteClass(實現類)

三、模式分析

模板方法,將基本方法封裝組合在一個抽象類中形成一個總演算法或者說一個總行為的方法。

模板方法的組成部分:

  • 抽象方法(Abstract Method)
  • 具體方法(Concrete Method)
  • 鉤子方法(HookMethod)

抽象類程式碼:

public abstract class AbstractClass
{
    public void templateMethod()  //模板方法
    {
        primitiveOperation1();
        primitiveOperation2();
        primitiveOperation3();
    }
    public void operation1()    //基本方法-具體方法
    {
        //實現程式碼
    }
    public abstract void operation2();    //基本方法-抽象方法
    public void operation3()    //基本方法-鉤子方法
    {
    }
} 

具體實現類程式碼:

public abstract class ConcreteClass
{
   /**
    * 基本方法-抽象方法
    */
    public abstract void operation2(){
        //具體實現
    }    
    
    /**
    * 基本方法-鉤子方法
    */
    public void operation3(){
        //具體實現
    }
} 

子類不顯性呼叫父類的方法,而是通過繼承的方法來實現具體的業務方法,也就是說父類控制子類的呼叫,這種機制叫好萊塢原則。好萊塢原則的定義為:“不要給我們打電話,我們會給你打電話(Don‘t call us, we’ll call you)”。

四、具體例子

資料庫操作的例子。資料庫操作分為連線、開啟、使用、關閉步驟。現在要使用mysql、oracle、db2等等關係型資料庫進行資料庫操作工具類的編寫。而對於使用這幾種不同的資料庫,其實只是連線的程式碼不同,而其它操作的程式碼都是差不多的,所以可以使用模板方法進行程式碼複用。

ps:這個例子來自《設計模式》一書,稍微改了一點

模板方法

public abstract class DBOperator
{   
//抽象方法
    public abstract void connDB();
    public void openDB()
    {
        System.out.println("開啟資料庫");
    }
    public void useDB()
    {
        System.out.println("使用資料庫");
    }
    public void closeDB()
    {
        System.out.println("關閉資料庫");    
    }
    //模板方法
   public void process()
   {
    connDB();
    openDB();
    useDB();
    closeDB();
   }
}

mysql資料庫

public class DBOperatorMysql extends DBOperator
{
    public void connDB()
    {
        System.out.println("使用JDBC-ODBC橋接連線Mysql資料庫");      
    }
}

Oracle資料庫

public class DBOperatorOracle extends DBOperator
{
    public void connDB()
    {
        System.out.println("使用JDBC-ODBC橋接連線Oracle資料庫");     
    }
}

呼叫


class Client
{
    public static void main(String a[])
    {
        DBOperator db1;
        
        db1=new DBOperatorMysql();
        db1.process();
        db1=new DBOperatorOracle();
        db1.process();
    }
}

五、模式應用場景

  • Spring、Struts2框架的應用,比如框架的初始化就有應用
    ...