Java的集合就是一個典型的,利用了模板方法模式的例子蹂匹。Java集合中的Collection集合包括List和Set兩大組成部分。List是隊列,而Set是沒有重復(fù)元素的集合火鼻。它們共同的接口都在Collection接口聲明;例如雕崩,都包含了size()魁索,isEmpty()方法。而AbstractCollection這個抽象類則實現(xiàn)了它們共同的方法盼铁,其余未實現(xiàn)的方法定義為抽象方法粗蔚。List和Set的實例類,就是通過繼承AbstractCollection(或它的子類)饶火,省去了許多重復(fù)性編碼的工作鹏控!
模板方法
一個模板方法是定義在抽象類中的,把基本操作方法組合在一起形成一個總算法或一個總行為的方法肤寝。
一個抽象類可以有任意多個模板方法当辐,而不限于一個。每一個模板方法都可以調(diào)用任意多個具體方法鲤看。
基本方法
基本方法又可以分為三種:抽象方法(Abstract Method)缘揪、具體方法(Concrete Method)和鉤子方法(Hook Method)。
? 抽象方法: 一個抽象方法由抽象類聲明义桂,由具體子類實現(xiàn)找筝。在Java語言里抽象方法以abstract關(guān)鍵字標示。
? 具體方法: 一個具體方法由抽象類聲明并實現(xiàn)慷吊,而子類并不實現(xiàn)或置換呻征。
? 鉤子方法: 一個鉤子方法由抽象類聲明并實現(xiàn),而子類會加以擴展罢浇。通常抽象類給出的實現(xiàn)是一個空實現(xiàn)陆赋,作為方法的默認實現(xiàn)。
abstract public class AbstractClass {
// 模板方法
public void templateMethod(){
hookMethod(); //調(diào)用基本方法(由子類實現(xiàn))
abstractMethod(); //調(diào)用基本方法(由子類實現(xiàn))
concreteMethod(); //調(diào)用基本方法(已經(jīng)實現(xiàn))
}
// 基本方法的聲明(由子類實現(xiàn)嚷闭,但抽象模板給出了默認實現(xiàn))
public void hookMethod() {}
// 基本方法的聲明(由子類實現(xiàn))
public abstract void abstractMethod();
// 基本方法(已經(jīng)實現(xiàn))
public final void concreteMethod(){
// do something
}
}
public class ConcreteClass extends AbstractClass {
// 基本方法的實現(xiàn)
@Override
public void hookMethod() {
// do something
}
// 基本方法的實現(xiàn)
@Override
public void abstractMethod() {
// do something
}
}
具體代碼參考:
抽象模板類:
abstract public class Account {
protected String accountNumber;
public Account() {
accountNumber = null;
}
public Account(String accountNumber) {
this.accountNumber = accountNumber;
}
// 模板方法攒岛,計算利息數(shù)額
public final double calculateInterest(){
double interestRate = doCalculateInterestRate();
String accountType = doCalculateAccountType();
double amount = calculateAmount(accountType, accountNumber);
return amount * interestRate;
}
// 基本方法留給子類實現(xiàn)
protected abstract String doCalculateAccountType();
// 基本方法留給子類實現(xiàn)
protected abstract double doCalculateInterestRate();
// 基本方法,已經(jīng)實現(xiàn)
private double calculateAmount(String accountType, String accountNumber){
// retrive amount from database
return 7243.00D;
}
}
具體子類實現(xiàn)
public class MoneyMarketAccount extends Account {
@Override
protected String doCalculateAccountType() {
return "Money Market";
}
@Override
protected double doCalculateInterestRate() {
return 0.045D;
}
}