国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

設計模式之模版方法模式

開發 前端
在設計模式中的模版方法模式,也是可以理解為一種規范模版。主要是提升我們代碼的復用性,以及擴展等問題。

[[405818]]

大家每到一家公司都會發現,每個公司都會有一個規范,比如說請假流程規范,代碼規范等等。每個公司都有這個流程,只是里面的具體執行條件不一樣而已。

在設計模式中的模版方法模式,也是可以理解為一種規范模版。主要是提升我們代碼的復用性,以及擴展等問題。

這樣的模板方法在我們當舔狗跟妹妹們聊天的時候也是可以用到的,比如這樣一個模板:

“寶,XXXX了,XXXX什么XX?X你的XXX”

當我拿到這樣一個模板的時候,我就可以舉一反三直接套用了,我們直接填參數就可以了,比如:

“寶,我打疫苗了,打的什么苗 ,愛你的每一秒 ”

“寶,我做核酸了,做的什么酸,得不到你的心酸”

“寶,今天去輸液了,輸的什么液,想你的夜”

...........

好了言歸正傳,在框架中模版方法模式也是很常見的。

今天就具體來聊聊設計模式中行為型設計模式中模版方法模式。

設計模式系列往期文章:

  • 單例模式
  • 工廠模式
  • 流程引擎
  • 建造者模式
  • 原型模式
  • 責任鏈模式
  • 觀察者模式
  • 策略模式

大綱

還是老規矩從上圖五個方面來分別具體和大家聊聊模版方法模式

定義

模版方法模式的定義以及目的?

  • 定義:模板方法模式在一個方法中定義一個算法骨架,并將某些步驟推遲到子類中實現。模板方法模式可以讓子類在不改變算法整體結構的情況下,重新定義算法中的某些步驟
  • 目的:1.使用模版方法模式的目的是避免編寫重復代碼,以便開發人員可以專注于核心業務邏輯的實現
  • 2.解決接口與接口實現類之間繼承矛盾問題
  • 以上定義來自《設計模式之美》

結構圖:

  • AbstractTemplate(抽象模版):定義一系列抽象方法,或者實現的方法,又或者是鉤子方法。即:定義流程
  • ConcreteTemplate(具體模版):實現父類抽象方法,基于本身不同的模版業務邏輯,實現不同的業務邏輯代碼。即:抽象方法實現相同,內部邏輯不同

整個結構圖看起來還是很簡單的,但是還是要理解設計模式解決什么問題。

代碼實現?還是舉例吧。

還是以上面的請假舉例吧,假設現在A公司請假需要直屬領導審批以及通知HR有人請假了就可以了,B公司需要直屬領導,部門負責人審批最后通知HR,方能完成整個請假流程。那作為OA辦公流程怎么去處理這個問題嘛?直接看代碼實現吧!

  1. public abstract class AskForLeaveFlow { 
  2.  
  3.     // 一級組長直接審批 
  4.     protected abstract void firstGroupLeader(String name); 
  5.  
  6.     // 二級組長部門負責人審批 
  7.     protected void secondGroupLeader(String name) { 
  8.     } 
  9.  
  10.     // 告知HR有人請假了 
  11.     private final void notifyHr(String name) { 
  12.         System.out.println("當前有人請假了,請假人:" + name); 
  13.     } 
  14.  
  15.     // 請假流模版 
  16.     public void askForLeave(String name) { 
  17.         firstGroupLeader(name); 
  18.         secondGroupLeader(name); 
  19.         notifyHr(name); 
  20.     } 
  21.  

首先還是定義一個請假流程,其中:

  • firstGroupLeader方法為abstract修飾,則作為子類都是必須要實現的
  • secondGroupLeader 二級領導審批,在子類中可以重寫,也可不重寫
  • notifyHr 方法為通知HR,已經內部實現

最后一個askForLeave請假流程方法,把以上模版方法串起來

  1. public class CompanyA extends AskForLeaveFlow { 
  2.      
  3.     @Override 
  4.     protected void firstGroupLeader(String name) { 
  5.         System.out.println("CompanyA 組內有人請假,請假人:" + name); 
  6.     } 
  7.  
  8. public class CompanyB extends AskForLeaveFlow { 
  9.     @Override 
  10.     protected void firstGroupLeader(String name) { 
  11.         System.out.println("CompanyB 組內有人請假,請假人:" + name); 
  12.     } 
  13.     @Override 
  14.     protected void secondGroupLeader(String name){ 
  15.         System.out.println("CompanyB 部門有人請假,請假人:" + name); 
  16.     } 

在CompanyA以及CompanyB中,secondGroupLeader二級領導可以選擇重寫或者不重寫,這個類模版方法簡稱為鉤子方法。

  1. public class testTemplate { 
  2.     public static void main(String[] args) { 
  3.         // 公司A請假流程模版 
  4.         AskForLeaveFlow companyA = new CompanyA(); 
  5.         companyA.askForLeave("敖丙"); 
  6.         // 結果:CompanyA 組內有人請假,請假人:敖丙 
  7.         //       當前有人請假了,請假人:敖丙 
  8.  
  9.         AskForLeaveFlow companyB = new CompanyB(); 
  10.         companyB.askForLeave("敖丙"); 
  11.         // 結果:CompanyB 組內有人請假,請假人:敖丙 
  12.         //      CompanyB 部門有人請假,請假人:敖丙 
  13.         //      當前有人請假了,請假人:敖丙 
  14.     } 

最后就是看測試dome結果了。companyA和companyB分別輸出了對應的請假流程。

細心的同學可能已經發現了,做為模版方法中里面除了可以有抽象方法外,還可以有具體的實現方法以及鉤子方法。

所以大家在應用的過程可以多考慮考慮在內部定義模版方法時,應該定義成抽象方法還是其它的。

框架中的應用

模版方法模式在我們常見的Java的框架中也是非常常見的,只是可能我們平時沒有注意到這一點而已。

第一個:首先我們學SpringMVC的時候,最開始都會寫一些Servlet來作為處理一些post或者get請求等。

這里直接看這個源碼大家就可以發現這也是直接使用模版方法模式的思想,期間在HttpServlet 繼承GenericServlet中也還是模版方法的體現,這說明了可以多次抽象構建模版。

第二個:常見問的文件流中,Java IO 類中的InputStream、OutputStream、Reader、Writer等都能看到模版方法模式的身影。

上面是我貼出的部分InputStream的源碼,主要看這個read模版方法,也就是模版方法模式的體現。

當然IO類中還有很多其他的,我就不一一貼源碼出來了,感情興趣的同學,可以自己打開源碼了解了解。

業務舉例

在業務中怎么使用模版方法?

首先需要理解模版方法它是為了增加代碼的復用性,以及擴展性而存在的,所以本著這個思想我還是給大家舉一個例子吧。

之前寫責任鏈模式最后給大家舉例商品詳情,這次還是用商品詳情,但是用模版方法模式來實現這個問題,理解為商詳2.0版本。

商品詳情展示我們可以是分模塊展示的,比如頭圖,商品信息,sku信息,配送地址,分期付費等等。

那么怎么進行組裝到商品詳情的展示呢?

流程圖:

可以看到一個請求過來,可以有模塊組裝器選擇組裝返回結果。

  • 提一個點,在第二步請求的模塊的時候為了減少整個鏈路的請求時間可以考慮是串行,或者并行(開線程池處理)。

接下來直接看代碼吧

  1. public abstract class AbstractTemplateBlock<T> { 
  2.     // 組裝結果 
  3.     public T template(ModelContainer modelContainer) { 
  4.         T block = initBlock(); 
  5.         try { 
  6.             this.doWork(modelContainer, block); 
  7.         } catch (Exception e) { 
  8.             // 可以選擇捕獲異常,是中斷流程,還是只打印日志,不中斷流程 
  9.         } 
  10.         return block; 
  11.     } 
  12.     // 初始化構建返回結果模型 
  13.     protected abstract T initBlock(); 
  14.     // 定義抽象模版 
  15.     protected abstract void doWork(ModelContainer modelContainer, T block) throws Exception; 

還是先創建模版Block

  1. @Component 
  2. public class ItemInfoBlock extends AbstractTemplateBlock<ItemInfoBlock.ItemInfo> { 
  3.     @Override 
  4.     protected ItemInfoBlock.ItemInfo initBlock() { 
  5.         return new ItemInfoBlock.ItemInfo(); 
  6.     } 
  7.  
  8.     // 模擬業務邏輯,組裝返回商品信息模塊數據 
  9.     @Override 
  10.     protected void doWork(ModelContainer modelContainer, ItemInfo block) throws Exception { 
  11.         block.setItemId(123L); 
  12.         block.setItemName("測試"); 
  13.     } 
  14.     @Data 
  15.     public static class ItemInfo { 
  16.         private Long itemId; 
  17.         private String itemName; 
  18.     } 

這里只寫了一個ItemInfoBlock,其他的模塊也是這一樣的寫法,所以就不全寫出來了。

  1. public static void main(String[] args) { 
  2.     // 1.模擬獲取SpringBean 
  3.     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); 
  4.     ItemInfoBlock itemInfoBlock = (ItemInfoBlock) applicationContext.getBean("itemInfoBlock"); 
  5.  
  6.   // 2. ModelContainer可以理解為貫穿上下文中的請求參數,或者一些組裝數據需要的預加載數據 
  7.    ModelContainer modelContainer  = new ModelContainer(); 
  8.    // 3. 獲取返回結果 
  9.    ItemInfoBlock.ItemInfo itemInfo = itemInfoBlock.template(modelContainer); 
  10.    System.out.println(JSON.toJSONString(itemInfo)); 
  11.    // 結果:{"itemId":123,"itemName":"測試"

最后就是看測試demo了,可以看到再每一個模塊中都是有一個AbstractTemplateBlock,內部包含doWork抽象方法,由子類去實現當前自己的業務邏輯。

同時第三步獲取返回結果時,我只是單獨列出來,大家可以根據實際情況還能做改造。比如說返回map結構等 mapKey 是模塊名稱,value是數據。

當前這種組裝商品詳情的模式也是比較常見的一種方式。代碼的復用性高,同時擴展性也有一定的體現,符合模版方法模式的思想。

總結

模版方法模式的特點大家應該也能體會到了,適用場景還是為了增加代碼的復用性,以及擴展性。

還是那句話存在即合理,不要因設計模式而在寫代碼時強行嵌套。合理的學習每種設計模式適合場景,解決什么問題。

 

責任編輯:姜華 來源: 三太子敖丙
相關推薦

2012-07-11 08:51:51

設計模式

2022-02-11 10:22:48

模版模式語言

2020-08-21 07:23:50

工廠模式設計

2021-06-29 08:54:23

設計模式代理模式遠程代理

2023-09-04 13:14:00

裝飾器設計模式

2021-12-24 07:50:45

責任鏈模式設計

2015-09-08 13:39:10

JavaScript設計模式

2012-01-13 15:59:07

2012-02-29 09:41:14

JavaScript

2021-06-09 08:53:34

設計模式策略模式工廠模式

2020-08-11 11:20:30

Typescript設計模式

2023-12-12 11:09:55

模板方法模式python設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2021-09-16 06:44:05

組合模式設計

2023-12-13 13:28:16

裝飾器模式Python設計模式

2022-03-25 11:01:28

Golang裝飾模式Go 語言

2021-06-22 15:27:13

設計模式迭代器模式Java

2010-04-13 08:54:28

PHP設計模式命令模式

2021-12-01 07:38:27

設計模式規格模式Specificati

2010-03-25 08:52:30

PHP設計模式代理模式
點贊
收藏

51CTO技術棧公眾號

99福利在线| 少妇高潮一区二区三区| 久久久久久99久久久精品网站| 国内精品美女av在线播放| 最近中文视频在线| 久久久久国产精品免费免费搜索| 欧美极品一区| jizzjizz欧美69巨大| 久久久极品av| 福利影院在线看| 在线免费观看日本一区| 99.玖玖.com| 暴力调教一区二区三区| 日本精品一区| 欧美激情亚洲| 国产成人综合av| 99er精品视频| 亚洲欧美国产日韩中文字幕| 在线毛片网站| 91传媒视频在线播放| 最近中文字幕mv第三季歌词| 久久久美女艺术照精彩视频福利播放| 亚洲午夜精品一区二区三区| 国产欧美一区二区色老头 | 91麻豆国产自产在线观看亚洲 | 男人天堂网在线| 91在线国产观看| 国产在线拍揄自揄拍无码| 欧美激情视频一区二区三区在线播放 | 91伦理视频在线观看| 亚洲一区二区综合| 激情五月亚洲色图| 国产天堂亚洲国产碰碰| 免费国产黄色网址| 东方欧美亚洲色图在线| 青少年xxxxx性开放hg| 青草av.久久免费一区| 日韩国产精品一区二区| 日本欧美加勒比视频| 一区二区三区偷拍| 久久99精品国产91久久来源| 国产一二三四区在线观看| 国产乱人伦精品一区二区在线观看| 中文字幕成人一区| 国产精品原创巨作av| 日韩中文字幕在线免费| www.欧美日韩国产在线| 91热这里只有精品| 亚洲精品国产第一综合99久久| 国外亚洲成av人片在线观看| 天天综合网 天天综合色| 日韩在线免费看| 91精品国产91久久久久久最新毛片 | 先锋成人av| 亚洲精品按摩视频| 国产经典一区| 色综合五月天导航| 久草在线成人| 国产精品日韩高清| 日韩高清在线观看| 亚洲 高清 成人 动漫| ㊣最新国产の精品bt伙计久久| 久久久亚洲精华液精华液精华液 | 日韩精品免费一区二区在线观看 | 国产精品影视在线| 成年人午夜免费视频| 国产欧美一二三区| 成r视频免费观看在线播放| 色综合久久天天综合网| 国产精品蜜臀| 久久久久久久久久久人体| 青青一区二区三区| 日韩电影大全在线观看| 北岛玲一区二区三区四区| 日本三级电影网| 日韩一级大片在线观看| 成人黄色在线| 国产精品欧美日韩| 久久久久中文| 久久99久久久久久| 一区二区三区在线视频免费观看| 成人动漫在线免费观看| 国产午夜精品全部视频在线播放| 日韩成人av在线资源| 国内外成人免费视频| 国产成人a级片| 中文字幕在线视频观看| 日韩av在线看| 精品国精品国产自在久国产应用| 久久99导航| 国产人成一区二区三区影院| 网友自拍视频在线| 九九热这里只有在线精品视| 亚洲先锋成人| 精品久久久久久久无码| 在线电影一区二区三区| 北条麻妃一区二区三区在线观看 | 亚洲成a人在线观看| 波多野一区二区| 热久久这里只有| 久久在线精品| 成人xxxx| 色婷婷综合成人av| 另类av一区二区| www.三区| 这里精品视频免费| 伊人久久成人| 99免费看香蕉视频| 亚洲天堂av在线播放| 欧美久久99| 91av入口| www亚洲精品| 日韩成人免费电影| 日本五码在线| 97视频在线观看网址| 国内精品国产三级国产a久久| 久草视频在线看| 国内外成人免费激情在线视频网站| 日韩精品一区第一页| 伪装者免费全集在线观看| 色与欲影视天天看综合网| 久久99久国产精品黄毛片色诱| 日夜干在线视频| 日本一区二区在线播放| 91蜜桃在线观看| 欲香欲色天天天综合和网| 久久国产精品高清| 欧美日韩国产一区在线| 国产乱论精品| 日本一区二区黄色| 国产一区二区黑人欧美xxxx| 羞羞答答国产精品www一本| 四虎在线视频| 国产女人18毛片水18精品| 国产精品久久久久久久浪潮网站| 欧美magnet| 中国一级黄色录像| 日韩精品一区在线| 亚洲自啪免费| 免费看美女视频在线网站| 99在线视频免费观看| 亚洲成av人片在线观看无码| 三级精品视频| 黄页在线观看| 欧美性在线视频| ㊣最新国产の精品bt伙计久久| 亚洲精品福利| 欧美少妇性生活视频| 久久视频免费在线播放| 91在线视频官网| 国产精品一区免费在线| 色综合手机在线| 欧美激情一区二区三区久久久| 久久久91精品国产一区二区三区| 国产高清日韩| 亚洲国产精品毛片av不卡在线| 久热在线中文字幕色999舞| 久久夜色精品国产欧美乱极品| 成人久久精品| www.xxx亚洲| 26uuu亚洲国产精品| 国产精品久久久久天堂| 香蕉精品久久| 在线视频se| 久久精品aaaaaa毛片| 精品国产第一区二区三区观看体验| 免费av网站大全久久| 日韩免费va| 亚洲国产精品毛片av不卡在线| 91sa在线看| 日韩人体视频一二区| 香蕉久久夜色精品国产| 美女扒开腿让男人桶爽久久软| 男女裸体影院高潮| 九色精品美女在线| 亚洲永久精品国产| 午夜精品久久| 国内精彩免费自拍视频在线观看网址| 日韩欧美视频免费在线观看| 裸体女人亚洲精品一区| 亚洲色图一区二区| 天天综合精品| 后进极品白嫩翘臀在线播放| 国产免费黄色一级片| 欧洲中文字幕国产精品| 欧美视频在线观看一区二区| 精品一区二区三区蜜桃| 懂色av一区二区| 国产专区在线| 日韩精品手机在线观看| 91精品国产成人www| 欧美性受极品xxxx喷水| 国产精品亚洲成人| 精品伊人久久久| 日韩伦理在线观看| 成人免费网站入口| 国产一区在线播放| 欧美大片一区二区| 国产精品人妖ts系列视频| 精品91久久久久|