六種常用的設計模式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等方法給處理出來,讓子類去實現。
那麼,模板模式就講到這兒了。