模版方法(Template Method)模式
:屬于類的行為模式,它的用意是定義一個操作中的算法的骨架,將一些操作延遲到子類中。使得子類可以不改變一個算法的結(jié)構(gòu)即可重新定義該算法的某些特定步驟。
模版方法模式的類圖如下:
模版方法模式有兩個角色:
1、
抽象模版(Abstract Template)角色
:定義了一個或多個抽象操作,同時定義了一個模版方法,它是一個具體的方法,作為抽象模版的骨架。實(shí)際的邏輯在抽象操作中,推遲到子類實(shí)現(xiàn)。
2、
實(shí)現(xiàn)模版(Concrete?Template)角色
:實(shí)現(xiàn)了抽象模版中一個或多個抽象方法。
?
這里舉個模擬計(jì)算器的例子來說模版方法模式,我們知道計(jì)算器計(jì)算的時候首先獲取操作數(shù)1,然后獲取操作數(shù)2,再進(jìn)行加減乘除運(yùn)算,最后顯示在屏幕上,對于計(jì)算器來說不管是計(jì)算加減乘除那一種,都是要獲取兩個操作數(shù),計(jì)算后再顯示。可以建立以下類圖模型:
?舉例代碼如下:
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:15:18 ?
- ?*描述:抽象模版角色 ?
- ?*/ ??
- public ? abstract ? class ?AbstractClass?{??
- ??
- ???? /** ?
- ?????*? ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:17:00 ?
- ?????*描述:模版方法 ?
- ?????*/ ??
- ???? public ? final ? void ?templateMethod(){??
- ???????? int ?m?=?getNum1();??
- ???????? int ?n?=?getNum2();??
- ???????? int ?s?=?operate(m?,n);??
- ????????show(s);??
- ????}??
- ??
- ???? /** ?
- ?????*? ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:21:49 ?
- ?????*描述:獲取第一個操作數(shù) ?
- ?????*/ ??
- ???? private ? int ?getNum1(){??
- ???????? return ? 8 ;??
- ????}??
- ???? /** ?
- ?????*? ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:21:49 ?
- ?????*描述:獲取第二個操作數(shù) ?
- ?????*/ ??
- ???? private ? int ?getNum2(){??
- ???????? return ? 2 ;??
- ????}??
- ???? /** ?
- ?????*? ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:19:53 ?
- ?????*描述:算法 ?
- ?????*/ ??
- ???? public ? abstract ? int ?operate( int ?m, int ?n);??
- ???? /** ?
- ?????*? ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:20:59 ?
- ?????*描述:顯示 ?
- ?????*/ ??
- ???? public ? void ?show( int ?s){??
- ????????System.out.println( "結(jié)果是:" +?s);??
- ????}??
- ??????
- }??
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:57:06 ?
- ?*描述:加法 ?
- ?*/ ??
- public ? class ?AddClass? extends ?AbstractClass{??
- ??
- ???? @Override ??
- ???? public ? int ?operate( int ?m, int ?n)?{??
- ???????? return ?m+n;??
- ????}??
- ??
- }??
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:57:24 ?
- ?*描述:減法 ?
- ?*/ ??
- public ? class ?SubClass? extends ?AbstractClass{??
- ??
- ???? @Override ??
- ???? public ? int ?operate( int ?m, int ?n)?{??
- ???????? return ?m-n;??
- ????}??
- ??
- }??
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:57:38 ?
- ?*描述:乘法 ?
- ?*/ ??
- public ? class ?MultiClass? extends ?AbstractClass{??
- ??
- ???? @Override ??
- ???? public ? int ?operate( int ?m, int ?n)?{??
- ???????? return ?m*n;??
- ????}??
- ??
- }??
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:57:50 ?
- ?*描述:除法 ?
- ?*/ ??
- public ? class ?DivClass? extends ?AbstractClass{??
- ??
- ???? @Override ??
- ???? public ? int ?operate( int ?m, int ?n)?{??
- ???????? return ?m/n;??
- ????}??
- ??
- }??
- package ?templateMethod;??
- /** ?
- ?*? ?
- ?*作者:alaric ?
- ?*時間:2013-8-9下午8:14:34 ?
- ?*描述:測試類 ?
- ?*/ ??
- public ? class ?Client?{??
- ??
- ???? /** ?
- ?????*作者:alaric ?
- ?????*時間:2013-8-9下午8:14:28 ?
- ?????*描述: ?
- ?????*/ ??
- ???? public ? static ? void ?main(String[]?args)?{??
- ???????? //加 ??
- ????????AbstractClass?c1?=? new ?AddClass();??
- ????????c1.templateMethod();??
- ???????? //減 ??
- ????????AbstractClass?c4?=? new ?SubClass();??
- ????????c4.templateMethod();??
- ???????? //乘 ??
- ????????AbstractClass?c2?=? new ?MultiClass();??
- ????????c2.templateMethod();??
- ???????? //除 ??
- ????????AbstractClass?c3?=? new ?DivClass();??
- ????????c3.templateMethod();??
- ??????????
- ??
- ????}??
- ??
- }??
結(jié)果是:10
結(jié)果是:6
結(jié)果是:16
結(jié)果是:4
整個計(jì)算過程(取操作數(shù),計(jì)算,顯示)使用了模版方法模式,模版方法規(guī)定程序?qū)崿F(xiàn)步驟,并且在子類中無法改變,而子類必須實(shí)現(xiàn)abstract修飾的抽象方法,不同的實(shí)現(xiàn)類可以有不同的實(shí)現(xiàn),這也是模版方法模式的用意。如果你了解策略模式,你會發(fā)現(xiàn)在每條算法的封裝上很像策略模式,而又不是策略模式,策略模式是利用委派的方法提供不同的算法行為,而模版方法是利用繼承來提供不同的算法行為的。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
