亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

23種設(shè)計(jì)模式(6):模版方法模式

系統(tǒng) 3273 0

文章來(lái)源: http://blog.csdn.net/zhengzhb/article/details/7405608

定義: 定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變算法的結(jié)構(gòu)即可重定義該算法中的某些特定步驟。

類型: 行為類模式

類圖:

23種設(shè)計(jì)模式(6):模版方法模式

事實(shí)上,模版方法是編程中一個(gè)經(jīng)常用到的模式。先來(lái)看一個(gè)例子,某日,程序員A拿到一個(gè)任務(wù):給定一個(gè)整數(shù)數(shù)組,把數(shù)組中的數(shù)由小到大排序,然后把排序之后的結(jié)果打印出來(lái)。經(jīng)過(guò)分析之后,這個(gè)任務(wù)大體上可分為兩部分,排序和打印,打印功能好實(shí)現(xiàn),排序就有點(diǎn)麻煩了。但是A有辦法,先把打印功能完成,排序功能另找人做。

  1. abstract class AbstractSort{
  2. /**
  3. *將數(shù)組array由小到大排序
  4. *@paramarray
  5. */
  6. protected abstract void sort( int []array);
  7. public void showSortResult( int []array){
  8. this .sort(array);
  9. System.out.print( "排序結(jié)果:" );
  10. for ( int i= 0 ;i<array.length;i++){
  11. System.out.printf( "%3s" ,array[i]);
  12. }
  13. }
  14. }

寫完后,A找到剛畢業(yè)入職不久的同事B說(shuō):有個(gè)任務(wù),主要邏輯我已經(jīng)寫好了,你把剩下的邏輯實(shí)現(xiàn)一下吧。于是把AbstractSort類給B,讓B寫實(shí)現(xiàn)。B拿過(guò)來(lái)一看,太簡(jiǎn)單了,10分鐘搞定,代碼如下:

  1. class ConcreteSort extends AbstractSort{
  2. @Override
  3. protected void sort( int []array){
  4. for ( int i= 0 ;i<array.length- 1 ;i++){
  5. selectSort(array,i);
  6. }
  7. }
  8. private void selectSort( int []array, int index){
  9. int MinValue= 32767 ; //最小值變量
  10. int indexMin= 0 ; //最小值索引變量
  11. int Temp; //暫存變量
  12. for ( int i=index;i<array.length;i++){
  13. if (array[i]<MinValue){ //找到最小值
  14. MinValue=array[i]; //儲(chǔ)存最小值
  15. indexMin=i;
  16. }
  17. }
  18. Temp=array[index]; //交換兩數(shù)值
  19. array[index]=array[indexMin];
  20. array[indexMin]=Temp;
  21. }
  22. }

寫好后交給A,A拿來(lái)一運(yùn)行:

  1. public class Client{
  2. public static int []a={ 10 , 32 , 1 , 9 , 5 , 7 , 12 , 0 , 4 , 3 }; //預(yù)設(shè)數(shù)據(jù)數(shù)組
  3. public static void main(String[]args){
  4. AbstractSorts= new ConcreteSort();
  5. s.showSortResult(a);
  6. }
  7. }

運(yùn)行結(jié)果:

排序結(jié)果: 0 1 3 4 5 7 9 10 12 32

運(yùn)行正常。行了,任務(wù)完成。沒(méi)錯(cuò),這就是模版方法模式。大部分剛步入職場(chǎng)的畢業(yè)生應(yīng)該都有類似B的經(jīng)歷。一個(gè)復(fù)雜的任務(wù),由公司中的牛人們將主要的邏輯寫好,然后把那些看上去比較簡(jiǎn)單的方法寫成抽象的,交給其他的同事去開(kāi)發(fā)。這種分工方式在編程人員水平層次比較明顯的公司中經(jīng)常用到。比如一個(gè)項(xiàng)目組,有架構(gòu)師,高級(jí)工程師,初級(jí)工程師,則一般由架構(gòu)師使用大量的接口、抽象類將整個(gè)系統(tǒng)的邏輯串起來(lái),實(shí)現(xiàn)的編碼則根據(jù)難度的不同分別交給高級(jí)工程師和初級(jí)工程師來(lái)完成。怎么樣,是不是用到過(guò)模版方法模式?

模版方法模式的結(jié)構(gòu)

模版方法模式由一個(gè)抽象類和一個(gè)(或一組)實(shí)現(xiàn)類通過(guò)繼承結(jié)構(gòu)組成,抽象類中的方法分為三種:

  • 抽象方法: 父類中只聲明但不加以實(shí)現(xiàn),而是定義好規(guī)范,然后由它的子類去實(shí)現(xiàn)。
  • 模版方法: 由抽象類聲明并加以實(shí)現(xiàn)。一般來(lái)說(shuō),模版方法調(diào)用抽象方法來(lái)完成主要的邏輯功能,并且,模版方法大多會(huì)定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
  • 鉤子方法: 由抽象類聲明并加以實(shí)現(xiàn)。但是子類可以去擴(kuò)展,子類可以通過(guò)擴(kuò)展鉤子方法來(lái)影響模版方法的邏輯。
  • 抽象類的任務(wù)是搭建邏輯的框架,通常由經(jīng)驗(yàn)豐富的人員編寫,因?yàn)槌橄箢惖暮脡闹苯記Q定了程序是否穩(wěn)定性。

實(shí)現(xiàn)類用來(lái)實(shí)現(xiàn)細(xì)節(jié)。抽象類中的模版方法正是通過(guò)實(shí)現(xiàn)類擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。只要實(shí)現(xiàn)類中的擴(kuò)展方法通過(guò)了單元測(cè)試,在模版方法正確的前提下,整體功能一般不會(huì)出現(xiàn)大的錯(cuò)誤。

模版方法的優(yōu)點(diǎn)及適用場(chǎng)景

容易擴(kuò)展。一般來(lái)說(shuō),抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現(xiàn)類一般可以很容易實(shí)現(xiàn)功能的擴(kuò)展,符合開(kāi)閉原則。

便于維護(hù)。對(duì)于模版方法模式來(lái)說(shuō),正是由于他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分布在不同的類中,維護(hù)起來(lái)是非常不方便的。

比較靈活。因?yàn)橛秀^子方法,因此,子類的實(shí)現(xiàn)也可以影響父類中主邏輯的運(yùn)行。但是,在靈活的同時(shí),由于子類影響到了父類,違反了里氏替換原則,也會(huì)給程序帶來(lái)風(fēng)險(xiǎn)。這就對(duì)抽象類的設(shè)計(jì)有了更高的要求。

在多個(gè)子類擁有相同的方法,并且這些方法邏輯相同時(shí),可以考慮使用模版方法模式。在程序的主框架相同,細(xì)節(jié)不同的場(chǎng)合下,也比較適合使用這種模式。

23種設(shè)計(jì)模式(6):模版方法模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 成人美女隐私免费 | 亚洲精品麻豆一区二区 | 亚洲一区二区三区在线免费观看 | 自拍亚洲国产 | 亚洲免费午夜视频 | 青青青青手机在线视频观看国产 | 人人做天天爱夜夜爽中字 | 成人老司机深夜福利久久 | 精品国产区一区二区三区在线观看 | 久久精品最新免费国产成人 | 一本色道久久综合亚洲精品 | 国产成人精品高清不卡在线 | 日本大片免a费观看在线 | 永久免费的啪啪免费的网址 | 日本一级毛片视频 | 26uuu欧美视频在线观看 | 久久一本久综合久久爱 | aaa毛片在线| 免费亚洲视频在线观看 | 夜夜躁日日躁狠狠 | 国产ww久久久久久久久久 | 伊人成年综合网 | 国产亚洲精品美女 | 日本久久高清视频 | 成人黄色网址 | 欧美综合激情 | 国产精品免费一区二区三区四区 | 国产精品久久久久久福利 | 26uuu精品一区二区 | 一区二区三区四区日韩 | 欧美日韩综合在线视频免费看 | 日韩经典欧美精品一区 | se01国产短视频在线观看 | 色18美女社区 | 草草草在线观看 | 天天干天天操天天添 | 成人老司机深夜福利久久 | 中文字幕第13亚洲另类 | 日韩中文字幕在线免费观看 | 欧美精欧美乱码一二三四区 | 天天爱天天色 |