摘要:在 Java 面向?qū)ο蟮某绦蛟O(shè)計中有效地利用模板設(shè)計模式, 可以巧妙解決變化對系統(tǒng)帶來的影響,使系統(tǒng)擴展性增強。本文重點討論了模板設(shè)計模式的定義與結(jié)構(gòu),并對其應(yīng)用進行了深入探討。
關(guān)鍵詞:模板方法;抽象類;具體類
中圖分類號:TP311文獻標(biāo)識碼:A文章編號:1009-3044(2008)19-30060-03
Studying the Design Model Based on Java
LIU Fan-yan
(Department of Information Engineering, Zhuzhou Professional Technology College, Zhuzhou 410000, China)
Abstract: Programming basic on Java Object Oriented, it would solve skillfully the change to the system, and enhance the system's extend if make full use of the template designing model. The article pays attetion to discuss the defing and structure of the template desinging modle, and lucubrate its application.
Key words: Template Method; Abstract Class; Entitative Class
1 引言
模板設(shè)計模式是一個很簡單的模式,卻被非常廣泛的使用。之所以簡單是因為在這個模式中僅僅使用到了繼承關(guān)系。而合理的利用繼承關(guān)系,能對系統(tǒng)設(shè)計起到很好的作用。模板設(shè)計模式就是其中的一個使用范例。深入研究模板設(shè)計模式能加深對繼承的理解,對OO的核心思想有更深更新的認(rèn)識,熟悉模扳設(shè)計模式是重新學(xué)習(xí)繼承的開始[1]。模板設(shè)計模式巧妙解決變化對系統(tǒng)帶來的影響。使用模板方法能使系統(tǒng)擴展性增強,最小化了變化對系統(tǒng)的影響。
2 定義與結(jié)構(gòu)
GOF給模板方法(Template Method)模式定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。所謂算法的結(jié)構(gòu),可以理解為根據(jù)需求設(shè)計出來的業(yè)務(wù)流程。而特定的步驟就是指那些可能在內(nèi)容上存在變化的環(huán)節(jié)。模板設(shè)計模式的簡單模式結(jié)構(gòu)為:
1) AbstractClass(抽象類):定義了一到多個的抽象方法,以供具體的子類來實現(xiàn)它們;而且還要實現(xiàn)一個模板方法,來定義一個算法的骨架;
2) ConcreteClass(具體類):實現(xiàn)父類中的抽象方法以完成算法中與特定子類相關(guān)的步驟。
圖1即為模板設(shè)計模式的結(jié)構(gòu)圖。
■
圖1 模板設(shè)計模式的結(jié)構(gòu)圖
3 模板設(shè)計模式的應(yīng)用研究
模板設(shè)計模式的應(yīng)用很多,比如有在線購物功能的網(wǎng)站,經(jīng)常要對商品進行各種各樣的排名:按商品的點擊率排名、按商品的購買率排名、按商品的入站時間排名、按商品的類別進行的搜索等等。這些都是一些搜索功能,功能完全相同;不同的要么是搜索的算法。又比如,銀行利率的計算,都是利率乘以本金和存款時間,但是,各種存款方式計算利率的方式不同,一般而言,定期的存款利率比活期高,而定期的時間越長,它的利率也越高。因此,我們在設(shè)計“銀行帳戶”這個類的時候,可以將計算利息這個方法定義成抽象方法,在這個方法中,將計算利息的算法的骨架搭建出來,而對于一些細(xì)節(jié),推遲到子類中實現(xiàn)。
這個思路的實現(xiàn)方法為:我們給所有類型的帳戶定義一個超類LoanAccount,在這個超類中,有一個用于計算利息的方法caculateInterest(),已經(jīng)將它的算法寫好了,這個方法返回一個“本金*利率”的值。但是,因為其中的利率根據(jù)存款類型的不同而不同,所以沒有具體的實現(xiàn)獲得利率的方法,所以將這個獲得利率的方法放到具體的子類AccountA及AccountB中去實現(xiàn),根據(jù)不同的子類,設(shè)計出不同的獲得利率的方法。下面是這個思路的具體實現(xiàn):
//TestAccoutn.java,該程序已在J2SE中調(diào)試通過
abstract class LoanAccount{
public double Interest;//利息
public double fund;//本金
public double calculateInterest(){
Interest=getFund()*getInterestRate();//用于計算利率的算法:本金*利率,但是利率的算法實現(xiàn)并沒有在這個類中實現(xiàn)
System.out.println(Interest);
return Interest;}
public void setFund(double fund){
this.fund=fund;}
public double getFund(){
return fund;}
protected abstract double getInterestRate();//不同的存款類型有不同的利率,因此,不在這個父類中實現(xiàn)利率的計算方法,而將它推遲到子類中實現(xiàn)
}
class AccountA extends LoanAccount{
public double getInterestRate(){
return 1.1;
}//實現(xiàn)父類中沒有實現(xiàn)的用于獲取利率的抽象方法
}
class AccountB extends LoanAccount{
public double getInterestRate(){
return 1.2;
}//實現(xiàn)父類中沒有實現(xiàn)的用于獲取利率的抽象方法
}
public class TestAccount{
public static void main(String[] args){
LoanAccount accounta=new AccountA();
LoanAccount accountb=new AccountB();
accounta.setFund(1000);
accounta.calculateInterest();
accountb.setFund(1000);
accountb.calculateInterest();
}}
運行結(jié)果為:
1100.0
1200.0
4 模板中的方法及模板設(shè)計模式的適應(yīng)情況
4.1 模板中的方法
模板設(shè)計模式中有四種方法可用在派生類中:
1) 完整的方法。它完成了所有子類都要用到的一些基本功能。這些方法稱為具體的方法;
2) 方法中根本沒有內(nèi)容,必須在派生類中實現(xiàn)的方法。例如,前面說到的getInterestRate()方法;
3) 鉤子(hook)方法。這些方法里包含了某些操作的一種默認(rèn)實現(xiàn),派生類里可以使用默認(rèn)也可以重新定義這些方法;
4) 還可以有這樣一種方法:它們自己調(diào)用抽象方法、鉤子方法和具體方法的各種組合。這些方法不僅有待重定義,還描述了一個沒有實現(xiàn)細(xì)節(jié)的算法。
4.2 模板設(shè)計模式的適應(yīng)情況
根據(jù)上面對定義的分析,以及例子的說明,可以看出模板方法適用于以下情況:
1) 一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn);
2) 各子類中公共的行為應(yīng)被提取出來并集中到一個公共父類中以避免代碼重復(fù);
3) 控制子類擴展。模板方法只在特定點調(diào)用操作,這樣就只允許在這些點進行擴展。比如上例中的getInterestRate()方法。
5 結(jié)束語
模板方法模式在OOP程序設(shè)計中很常見,它既不復(fù)雜也不難理解,在設(shè)計中不應(yīng)該將它考慮得過于復(fù)雜。
模板方法模式是為了巧妙解決變化對系統(tǒng)帶來的影響而設(shè)計的。使用模板方法使系統(tǒng)擴展性增強,使變化對系統(tǒng)的影響最小化。
模板方法模式的第一個要點是,基類可以只定義一些它自己要使用的方法,把其余部分留到派生類中去實現(xiàn)。第二個要點是基類中的方法可以調(diào)用一系列的方法,其中有些方法在基類中實現(xiàn),有些方法在派生類中實現(xiàn)。模板方法定義了一個通用的算法,盡管細(xì)節(jié)部分在基類中沒有完全表現(xiàn)出來。
參考文獻:
[1] GOF. thinking in java[M].
[2] 教育部考試中心, 新東方教育科技集團.Java面向?qū)ο蟪绦蛟O(shè)計[M].
[3] 古凌嵐,羅佳,張嬋. Java程序設(shè)計[M].清華大學(xué)出版社,2005.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文