精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設計模式之模版方法模式

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

[[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

工廠模式設計

2015-09-08 13:39:10

JavaScript設計模式

2012-01-13 15:59:07

2023-09-04 13:14:00

裝飾器設計模式

2021-12-24 07:50:45

責任鏈模式設計

2021-06-29 08:54:23

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

2021-06-09 08:53:34

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

2012-02-29 09:41:14

JavaScript

2020-08-11 11:20:30

Typescript設計模式

2023-12-12 11:09:55

模板方法模式python設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2021-06-22 15:27:13

設計模式迭代器模式Java

2021-12-01 07:38:27

設計模式規格模式Specificati

2010-04-13 08:54:28

PHP設計模式命令模式

2021-09-16 06:44:05

組合模式設計

2023-12-13 13:28:16

裝飾器模式Python設計模式

2022-03-25 11:01:28

Golang裝飾模式Go 語言

2021-01-21 05:34:14

設計模式建造者
點贊
收藏

51CTO技術棧公眾號

成人短视频在线| 欧美三级午夜理伦| 在线精品自拍| 欧美性20hd另类| 亚洲一区二区不卡视频| 亚洲精品久久久久久久久久久久久久| 在线日本高清免费不卡| 亚洲人午夜精品免费| 婷婷激情5月天| 国产高清中文字幕在线| 国产精品视频观看| 国产麻豆日韩| 97在线播放免费观看| 亚洲麻豆一区| 久久夜色精品亚洲噜噜国产mv| 久久人人爽人人人人片| 亚洲精品毛片| 精品欧美激情精品一区| 男女h黄动漫啪啪无遮挡软件| 午夜成人鲁丝片午夜精品| 精品影院一区二区久久久| 91黄色8090| 国产成人精品视频免费| 老司机精品在线| 91精品在线观看入口| 色七七在线观看| h片在线观看| 国产午夜精品久久| 久久免费一区| 日本高清视频免费观看| 激情综合亚洲精品| 国产精品对白刺激| 日韩中文字幕在线观看视频| 欧美日本一区| 欧美成人一区二区三区电影| 日韩av片在线免费观看| 欧美伦理在线视频| 国产视频精品自拍| 久久久久9999| 精品国产18久久久久久洗澡| 欧美一级一区二区| 999久久久精品视频| 国产成人精品一区二区三区在线| 一本色道久久加勒比精品| 波多野结衣乳巨码无在线| 亚洲七七久久综合桃花剧情介绍| 国产精品天干天干在线综合| 日韩免费av一区二区三区| 视频一区二区在线播放| 成人av在线播放网址| eeuss一区二区三区| 国产xxxx孕妇| 国产ts人妖一区二区| 91成人理论电影| www.久久精品.com| 国产在线播放一区三区四| 成人激情av在线| 国产又粗又黄又爽视频| 精品一区二区三区在线播放视频| 国产精品久久视频| 中文字幕欧美人妻精品| 美国一区二区三区在线播放 | 国产91在线亚洲| 成人在线观看免费网站| 亚洲激情av在线| 久久久天堂国产精品| 先锋影音在线资源站91| 亚洲在线一区二区三区| 妞干网在线观看视频| 麻豆免费在线| 欧美性色黄大片手机版| 一级黄色录像在线观看| 麻豆一二三区精品蜜桃| 欧美www视频| 亚洲人人夜夜澡人人爽| 国产一区二区区别| 日韩一区二区在线视频| 激情五月婷婷小说| 亚洲免费激情| 国产精品激情av在线播放 | 蜜桃av一区二区三区| 成人午夜在线影院| 亚洲黄色小说网| 久久久影视传媒| 一本一道久久a久久综合精品| 羞羞电影在线观看www| 激情成人在线视频| 亚洲精品一二三四五区| 亚洲一二三区视频| 亚洲欧美国产精品久久久久久久 | 在线视频日韩欧美| 国产伦精品一区二区三区免费优势| 亚洲精品美女在线观看| 极品尤物一区二区| 国内精品美女在线观看| 国产精品高精视频免费| 精品国自产在线观看| 久久久久久久网| 青草全福视在线| 欧美成人免费电影| 日韩欧美国产一区二区三区 | 国产1区在线观看| 久久精品日产第一区二区三区高清版 | 久久久亚洲国产天美传媒修理工| 日韩三级一区二区| 国产宾馆实践打屁股91| 亚洲高清在线观看一区| 美足av综合网| 精品视频在线视频| 国产精品无码一区二区三| 久久视频在线| 日韩美女写真福利在线观看| 国产sm主人调教女m视频| 国产午夜亚洲精品不卡| www..com日韩| 99久久久国产| 国产午夜精品视频免费不卡69堂| www.99re7.com| 国内精品久久久久影院薰衣草| 美日韩免费视频| 天堂av在线电影| 欧美精品三级日韩久久| 中文字幕 自拍| 中文久久精品| 国产99视频精品免费视频36| 黄色视屏免费在线观看| 欧美亚洲动漫制服丝袜| 免费看污黄网站在线观看| 红桃视频国产精品| 3d精品h动漫啪啪一区二区| 在线视频三区| 色狠狠av一区二区三区| 久久人人爽人人爽人人片| 欧美视频久久| 亚洲伊人第一页| 麻豆传媒在线完整视频| 欧美日韩在线电影| 久久午夜福利电影| 丝袜诱惑亚洲看片| 欧美精品一区三区在线观看| 忘忧草在线日韩www影院| 精品国产一区a| 免费在线观看国产精品| 国产一区高清在线| 99亚洲精品视频| 亚洲男男av| 久久最新资源网| 国产精品羞羞答答在线| 日韩一区欧美一区| 午夜啪啪小视频| 久久久久久久久久久久久久| 91久久久亚洲精品| а√中文在线8| 欧美一区二区视频在线观看| 91视频综合网| 丁香婷婷综合激情五月色| 欧美又粗又长又爽做受| 福利电影一区 | 欧美三级精品| 中文字幕精品在线视频| 亚洲视频久久久| 亚洲女同ⅹxx女同tv| 在线观看网站黄| 影音先锋中文字幕一区| 久久久久久亚洲精品不卡4k岛国| 亚洲精品成人图区| 一区二区在线视频| 岳乳丰满一区二区三区| 亚洲图片激情小说| 久草免费资源站| 午夜影院日韩| 一区二区高清视频| 欧美久久一区二区三区| 国内外成人免费激情在线视频网站| 五月婷婷六月激情| 欧美午夜影院一区| www.超碰在线观看| caoporen国产精品视频| 中文字幕欧美人妻精品一区| 97久久夜色精品国产| 99高清视频有精品视频| 色多多在线观看| 日韩在线视频网| 亚洲国产精彩视频| 在线日韩av片| 久草网视频在线观看| 26uuu亚洲综合色欧美| 在线观看免费av网址| 亚洲国产激情| 亚洲视频导航| 啪啪激情综合网| 亚洲精品免费网站| 日韩精品影院| 欧美激情久久久久久| 春暖花开成人亚洲区| 日韩欧美二区三区| 亚洲色成人www永久网站| 亚洲精品综合在线| 精品无码国产污污污免费网站| 国产在线视频一区二区三区| 97在线免费公开视频| 亚洲无中文字幕| 日韩av电影免费播放| 中文字幕日韩高清在线| 国产精品狼人色视频一区| 国内老司机av在线| 深夜精品寂寞黄网站在线观看| 欧美 日韩 国产 成人 在线| 欧美日韩在线播| 国内免费精品视频| 亚洲免费电影在线| 少妇愉情理伦三级| www激情久久| 少妇精品无码一区二区| 久久99久久精品欧美| 北条麻妃69av| 黄色日韩精品| 久久99国产精品一区| 欧美日韩色图| 麻豆成人av| 欧美午夜18电影| 成人av网站观看| 国产精品99久久免费| 国产精品嫩草影院久久久| 深夜福利视频一区二区| 久久欧美在线电影| 羞羞视频在线观看免费| 不卡av在线网站| 欧美另类极品| 中文字幕亚洲国产| 久热av在线| 亚洲欧美国产另类| 青青草超碰在线| 日韩电影中文字幕一区| 欧美视频在线观看一区二区三区| 欧美一级艳片视频免费观看| 国产精品久久久久精| 欧美日韩中文字幕精品| 中文字幕一区二区三区人妻四季 | 国产欧美久久久| 欧美精品自拍偷拍动漫精品| 一本色道久久综合亚洲| 欧美三级乱人伦电影| 国产精品传媒在线观看| 在线视频一区二区三区| 无码人妻丰满熟妇精品区| 日韩欧美国产中文字幕| 国产精品第5页| 色婷婷综合久久| 波多野结衣一二区| 欧美在线观看18| 中文字幕人成人乱码亚洲电影| 欧美日韩激情一区二区| 亚洲一区二区三区高清视频| 欧美日韩久久一区| 国产精品久久久午夜夜伦鲁鲁| 3751色影院一区二区三区| 国产精品久久影视| 日韩欧美一区二区三区在线| 丰满肥臀噗嗤啊x99av| 亚洲国产欧美一区二区三区同亚洲 | gogo大尺度成人免费视频| 69堂成人精品视频免费| 国产成人一二片| 久久av一区二区三区亚洲| 国产亚洲一区二区三区啪| 手机看片福利永久国产日韩| 久久日文中文字幕乱码| 日本久久高清视频| 亚洲美女91| 污污视频网站免费观看| 久久国产生活片100| 9191在线视频| 91免费版在线看| 羞羞在线观看视频| 一区二区三区国产精品| 天天综合天天干| 欧美在线一区二区三区| 国内精品偷拍视频| 亚洲精品天天看| 视频一区二区三区不卡| 久久97久久97精品免视看| 涩涩av在线| 国产在线观看一区二区三区| 超碰一区二区三区| 日韩精品国内| 国产精品多人| 中文字幕在线观看第三页| 国产麻豆视频精品| 天天躁日日躁aaaxxⅹ | 日韩成人免费在线观看| 91国在线观看| 亚洲AV午夜精品| 在线丨暗呦小u女国产精品| 日本高清在线观看| 国产精品96久久久久久| 亚洲成人影音| 午夜精品一区二区在线观看| 激情偷拍久久| 青青草久久伊人| 91免费视频大全| 欧美精品xxxxx| 欧美日韩亚洲综合在线| 刘亦菲毛片一区二区三区| 在线亚洲国产精品网| 国产福利片在线观看| 91久久精品日日躁夜夜躁国产| 国产精品亚洲片在线播放| 久久观看最新视频| 日韩成人免费看| 日本黄色免费观看| 亚洲男人的天堂av| 正在播放亚洲精品| 日韩电影免费观看中文字幕| 中文国产字幕在线观看| 国产精品日韩在线观看| 亚洲动漫在线观看| 韩日视频在线观看| 国产一区二区导航在线播放| 国产午夜精品久久久久久久久| 午夜久久久久久电影| 国产99久一区二区三区a片| 中文字幕精品在线视频| 在线看欧美视频| 久久综合一区二区三区| 亚洲国产高清视频| 精品无码av一区二区三区| 亚洲激情第一区| 99久久久久成人国产免费| 最近2019年好看中文字幕视频 | 欧美日韩国产bt| 嫩草研究院在线观看| 91av视频在线免费观看| 岛国精品一区| 丁香六月激情网| 国产成人午夜精品影院观看视频 | 欧美成人三级在线| 很黄的网站在线观看| 国产欧美一区二区白浆黑人| 精品一区二区三区在线| 黄色国产小视频| 国产亚洲精品bt天堂精选| 亚洲欧美一二三区| 国产亚洲精品久久久久动| 欧美大片免费高清观看| 日本一区网站| 蜜臀va亚洲va欧美va天堂 | 日韩成人三级| 三上悠亚av一区二区三区| 中文字幕高清一区| 夜夜嗨av禁果av粉嫩avhd| 最近免费中文字幕视频2019| 国产a亚洲精品| 精品一区二区成人免费视频| 国产一区二区精品久久91| 国产人妻精品一区二区三区不卡| 在线91免费看| 欧美人与动牲性行为| 国产精品免费一区二区| 一区二区三区国产在线| 毛片网站免费观看| 欧美性生活影院| 18videosex性欧美麻豆| 国产精品对白刺激久久久| 国产精品呻吟| 亚洲AV成人无码网站天堂久久| 51午夜精品国产| 国产啊啊啊视频在线观看| 精品国产一区二区三区麻豆免费观看完整版 | 日本午夜在线视频| 国产精品igao视频| 亚洲天天综合| 少妇毛片一区二区三区| 欧美视频在线观看一区二区| av小次郎在线| 九九九热999| 免费不卡在线观看| 青青草手机在线观看| 日韩成人av一区| 丁香婷婷久久| 亚洲精品蜜桃久久久久久| 久久免费的精品国产v∧| 97人妻一区二区精品免费视频| 韩国日本不卡在线| 成人精品影视| 黑人无套内谢中国美女| 欧美性猛交xxxxx免费看| 欧美videos极品另类| 国产中文一区二区| 久久国产人妖系列| 亚洲精品国产精品乱码| 中文字幕亚洲无线码a| 巨人精品**| 涩涩网站在线看| 欧美视频在线看| а√天堂在线官网| 欧美一进一出视频| 国产成人激情av| 中文字幕777| 韩国日本不卡在线|