1. 程式人生 > >六種常用的設計模式java實現(四)模板模式

六種常用的設計模式java實現(四)模板模式

模板模式,估計大家應該都接觸過,比如說,在完成某個業務邏輯前,需要處理一點事,在完成後也要處理一點事,這樣就可以把不一樣的地方給抽象出來,然後公共的地方都是一樣的,這樣的場景就會用到模板模式。

一、基本概念

模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。

二、結構

抽象模板(Abstract Template)角色有如下責任:
■  定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。
■  定義並實現了一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能呼叫一些具體方法。
具體模板(Concrete Template)角色又如下責任:
■  實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。
■  每一個抽象模板角色都可以有任意多個具體模板角色與之對應,而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。
模板模式的關鍵是:子類可以置換掉父類的可變部分,但是子類卻不可以改變模板方法所代表的頂級邏輯。

三、程式碼實現

首先,準備一個抽象類:

package org.wuqiong.designpattern.templatepattern;

/**
 * ClassName:Account <br/>
 * Function: 抽象模板角色類. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2016年1月29日 下午3:45:29 <br/>
 * 
 * @author qiyongkang
 * @version
 * @since JDK 1.6
 * @see
 */

public abstract
class Account { /** * 模板方法,計算利息數額 * * @return 返回利息數額 */ public final double calculateInterest() { double interestRate = doCalculateInterestRate(); String accountType = doCalculateAccountType(); double amount = calculateAmount(accountType); return
amount * interestRate; } /** * 基本方法留給子類實現 */ protected abstract String doCalculateAccountType(); /** * 基本方法留給子類實現 */ protected abstract double doCalculateInterestRate(); /** * 基本方法,已經實現 */ private double calculateAmount(String accountType) { /** * 省略相關的業務邏輯 */ return 7243.00; } }

然後,不同的實現類,可以完成不同的邏輯,但都是同樣的執行邏輯。

package org.wuqiong.designpattern.templatepattern;
/**
 * ClassName:CDAccount <br/>
 * Function: 具體模板角色類. <br/>
 * Date:     2016年1月29日 下午3:52:03 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see  
 */
public class CDAccount extends Account {

    @Override
    protected String doCalculateAccountType() {
        return "Certificate of Deposite";
    }

    @Override
    protected double doCalculateInterestRate() {
        return 0.06;
    }

}
package org.wuqiong.designpattern.templatepattern;
/**
 * ClassName:MoneyMarketAccount <br/>
 * Function: 具體模板角色類. <br/>
 * Date:     2016年1月29日 下午3:51:01 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see
 */
public class MoneyMarketAccount extends Account {

    @Override
    protected String doCalculateAccountType() {
        return "Money Market";
    }

    @Override
    protected double doCalculateInterestRate() {
        return 0.045;
    }

}

最後,準備一個測試客戶端:

package org.wuqiong.designpattern.templatepattern;
/**
 * ClassName:Client <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:   TODO ADD REASON. <br/>
 * Date:     2016年1月29日 下午3:54:16 <br/>
 * @author   qiyongkang
 * @version  
 * @since    JDK 1.6
 * @see      
 */
public class Client {
    public static void main(String[] args) {
        Account account = new MoneyMarketAccount();
        System.out.println("貨幣市場賬號的利息數額為:" + account.calculateInterest());
        account = new CDAccount();
        System.out.println("定期賬號的利息數額為:" + account.calculateInterest());
    }
}

通過模板模式可以看出,就是把那些可能處理邏輯不一樣的地方給抽離出來,讓具體的實現類去實現。其實,想servlet處理http請求時,httpService中的service()方法就體現出了模板方法模式,將處理get、post、put、delete等方法給處理出來,讓子類去實現。
那麼,模板模式就講到這兒了。