精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人福利视频网站| 九一国产精品| 亚洲日本在线视频观看| 91精品在线一区| 免费成人深夜蜜桃视频| 日韩电影精品| 亚洲图片欧美激情| 翡翠波斯猫1977年美国| 97免费在线观看视频| 亚州国产精品| 欧美无乱码久久久免费午夜一区| 中文字幕剧情在线观看一区| 午夜精品久久久久久久第一页按摩 | 午夜不卡一区| 亚洲综合色在线| 美媛馆国产精品一区二区| 免费在线不卡av| 中文字幕免费一区二区| 亚洲国产精品va在线观看黑人| 丰满少妇被猛烈进入高清播放| 成人动漫在线免费观看| 黄色日韩网站视频| 7777kkkk成人观看| 三级黄色片在线观看| 成人在线视频你懂的| 激情成人中文字幕| 亚洲蜜桃av| 欧美综合视频在线| 久久99国产精品成人| 午夜精品蜜臀一区二区三区免费| 日本一区二区视频在线播放| 精品视频在线观看网站| 在线视频一区二区免费| 久久久久久久9| 午夜成人免费影院| 国产乱子伦一区二区三区国色天香| 91国在线精品国内播放| 男人晚上看的视频| 日韩高清一级| 日韩欧美在线一区二区三区| 丁香婷婷激情网| 福利成人导航| 自拍偷拍亚洲欧美日韩| 秋霞毛片久久久久久久久| 亚洲AV无码国产精品午夜字幕| 日日嗨av一区二区三区四区| 韩剧1988在线观看免费完整版| 我要看一级黄色录像| 久久av综合| 亚洲国产成人精品久久久国产成人一区| 亚洲国产日韩欧美在线观看| 在线男人天堂| 亚洲大尺度视频在线观看| 在线观看视频黄色| 欧美私人网站| 国产欧美精品一区二区色综合 | 一区二区三区在线观看av| 影音先锋在线一区| 九九久久久久99精品| 北条麻妃在线观看视频| 日韩在线观看| 一区二区三区日韩在线| 国产精品无码一区二区三区免费| jizz18欧美18| 日韩欧美国产小视频| 中文字幕精品一区二区三区在线| 97久久网站| 欧美在线观看禁18| 992kp快乐看片永久免费网址| 亚洲精品日产| 懂色aⅴ精品一区二区三区蜜月| 青青在线免费观看| 丁香花高清在线观看完整版| 亚洲综合久久久| 一级性生活视频| 超碰免费在线播放| 亚洲精品水蜜桃| 97超碰在线视| 国产三线在线| 午夜视频一区二区三区| 少妇无码av无码专区在线观看| 超碰成人av| 天天综合天天做天天综合| 国产中文字幕在线免费观看| 中日韩脚交footjobhd| 一本色道久久加勒比精品| 日日碰狠狠丁香久燥| 天堂久久午夜av| 欧美另类z0zxhd电影| 激情久久综合网| 亚洲无线观看| 国产视频精品在线| 欧美丰满美乳xxⅹ高潮www| 成人毛片在线| 久久成人av网站| 国产在线视频99| 国产精品久久777777毛茸茸| 国产精品成熟老女人| 97在线视频人妻无码| 国产风韵犹存在线视精品| 国产青春久久久国产毛片| 久久视频www| 国产精品国产三级国产有无不卡| 亚洲天堂第一区| a级片在线免费观看| 精品久久久久久久久久国产| 日本久久精品一区二区| 国产精品成人3p一区二区三区 | 久久精品人人做人人爽| 久久中文字幕无码| 日韩1区2区日韩1区2区| 亚洲资源在线看| 日本午夜在线| 亚洲视频在线观看一区| 黄色一级视频片| 成人国产精选| 亚洲高清一二三区| 久久久久麻豆v国产| 国产欧美不卡| 亚洲a中文字幕| 欧美日韩伦理片| 亚洲卡通动漫在线| 成人亚洲视频在线观看| 久久国产精品美女| 亚洲欧美日韩网| 人妻少妇精品一区二区三区| 久久精品综合| 国产精品国产精品国产专区不卡| 福利成人在线观看| 香蕉加勒比综合久久| 8x8x成人免费视频| 亚洲尤物av| 欧美高清视频免费观看| 中文字幕久久久久| 91在线视频18| 大地资源网在线观看免费官网| 欧美不卡高清一区二区三区| 亚洲成人教育av| 亚洲天堂一级片| 日本中文字幕一区二区视频| 97人人模人人爽人人喊38tv| 91精品国产91久久久久游泳池| 欧美日韩国产限制| zjzjzjzjzj亚洲女人| 国产精品久久久久9999赢消| 国产大片精品免费永久看nba| 日本高清视频免费看| 日韩码欧中文字| 乌克兰美女av| 色综合综合网| 欧美一区二区三区…… | 亚洲综合激情网| 日本人69视频| 欧美日韩国产在线观看网站| 91干在线观看| 天堂v在线观看| 亚洲国产aⅴ成人精品无吗| 日韩av影视大全| 天天做天天爱天天综合网| 国产精品自产拍在线观看中文| 你懂的在线播放| 日韩欧美一区二区三区| 内射中出日韩无国产剧情| 亚洲片区在线| 精品国产一区二区三区麻豆免费观看完整版 | 在线不卡的av| 精品一区二区在线观看视频| 日韩精品五月天| 欧美影视一区二区| 日韩精品影院| 一本一本久久a久久精品综合小说| 国产综合精品视频| 久久久不卡影院| 成人性视频欧美一区二区三区| 欧美极品在线观看| 国产精品美女www爽爽爽视频| 成年网站在线| 欧美日韩综合一区| 久久久精品少妇| 蓝色福利精品导航| 在线观看18视频网站| 亚洲午夜免费| 91精品国产色综合| 国产中文字幕在线看| 欧美性欧美巨大黑白大战| 国产又色又爽又高潮免费| 国内久久婷婷综合| 久久99久久久久久| 私拍精品福利视频在线一区| 国产成人亚洲综合青青| 在线日本视频| 欧美一级在线免费| www.99re7.com| 久久中文字幕电影| 欧美美女一级片| 激情综合自拍| 欧美下载看逼逼| 久久久久伊人| 久久露脸国产精品| 国产福利小视频在线观看| 7799精品视频| 日韩黄色a级片| 国产日韩v精品一区二区| 久久久久久久久久一区二区| 狠狠色综合网| 日本一区免费在线观看| 国产一区二区三区精品在线观看 | 91www在线| 亚洲最新在线视频| www.国产三级| 色88888久久久久久影院野外| 国产suv精品一区二区68| 91在线播放网址| 老司机午夜性大片| 国产欧美亚洲一区| 黄色高清视频网站| 香蕉视频一区二区三区| 91视频九色网站| 国产精品一区二区av影院萌芽| 久久九九亚洲综合| 欧美在线观看在线观看| 日韩一区二区在线看片| 无码人妻精品一区二区三区不卡 | 国产亚洲自拍av| 国产日韩欧美激情| 艳妇乳肉亭妇荡乳av| 国产一区啦啦啦在线观看| 欧美黄网站在线观看| 欧美aⅴ99久久黑人专区| 日韩高清专区| 久久aimee| 亚洲综合中文字幕68页| 国产一区二区主播在线| 91高清视频免费观看| 性欧美videoshd高清| 中文字幕亚洲色图| 青春有你2免费观看完整版在线播放高清| 日韩网站在线看片你懂的| 亚洲av综合一区| 欧美日韩裸体免费视频| 久久久久久天堂| 亚洲欧美一区二区在线观看| 日韩女同一区二区三区| 91亚洲精华国产精华精华液| 亚洲成人精品在线播放| 国产自产2019最新不卡| 怡红院亚洲色图| 日韩av不卡一区二区| 91av俱乐部| 国产精品久久久亚洲一区| av在线com| 欧美久久九九| 老汉色影院首页| 欧美第一精品| 亚洲资源视频| 日产精品一区二区| 婷婷久久五月天| 精品视频黄色| 视频一区二区综合| 成人毛片免费看| 亚洲欧洲日韩精品| 国产一区二区亚洲| 午夜精品区一区二区三 | 亚洲美女网站18| 日韩国产专区| 亚洲三区四区| 天天射综合网视频| gogogo免费高清日本写真| 久久精品久久久| 中文字幕在线观看一区二区三区| 国产韩日影视精品| 中国成人亚色综合网站| 欧美影院一区| 成年人网站国产| 亚洲久久在线| 国产中文字幕视频在线观看| 欧美亚洲一级| 免费涩涩18网站入口| 久久精品国产亚洲高清剧情介绍| 岛国毛片在线播放| 国产精品1区二区.| 日本不卡视频一区| 久久综合给合久久狠狠狠97色69| 亚洲黄色小说视频| 中文字幕在线不卡一区二区三区| 亚洲一级生活片| 亚洲国产日韩a在线播放| 国产午夜在线播放| 欧美曰成人黄网| 国产情侣av在线| 精品国产一区二区三区久久影院 | 久久久久久久少妇| 国内精品自线一区二区三区视频| 色综合久久久无码中文字幕波多| 成人福利视频网站| 长河落日免费高清观看| 一区二区在线观看视频| 女人十八岁毛片| 欧美亚日韩国产aⅴ精品中极品| 国产精品自拍电影| 日韩电影在线观看中文字幕 | 在线精品高清中文字幕| а√资源新版在线天堂| 668精品在线视频| 日韩一区二区三区免费视频| 亚洲在线免费视频| 精品国产99| 久久久久久久久影视| 久久国产精品毛片| 91网址在线观看精品| 91蜜桃免费观看视频| 亚洲天堂网av在线| 欧美日韩在线视频一区| 国产理论视频在线观看| 国产网站欧美日韩免费精品在线观看 | www.xxxx精品| 蜜桃av在线| 91久久国产综合久久91精品网站| 网友自拍一区| 日本一道在线观看| 日韩福利视频导航| 精品视频站长推荐| 最新热久久免费视频| 国产婷婷色一区二区在线观看| 日韩一级完整毛片| 成年女人的天堂在线| 久久免费观看视频| 国产精品成人**免费视频| 色女孩综合网| 在线欧美一区| 网站在线你懂的| 国产欧美精品国产国产专区| 男人的天堂一区| 欧美一卡在线观看| 男人在线资源站| 国产精品wwww| 麻豆成人入口| 欧美国产综合在线| 国产在线精品不卡| 黄色一级片一级片| 日本韩国欧美国产| 天天射天天色天天干| 欧美激情日韩图片| 精品久久国产一区| 影音欧美亚洲| 青青草原综合久久大伊人精品优势| 国产不卡一二三| 亚洲综合无码一区二区| 国产人妖在线播放| 久久视频这里只有精品| 色综合久久久| 亚洲精品中文字幕乱码三区不卡 | 精品自拍视频在线观看| 欧美亚洲黄色| 亚洲在线播放电影| 韩国v欧美v亚洲v日本v| 免费在线观看黄色小视频| 欧美日韩国产影片| 日韩欧美小视频| 国产欧美日韩高清| 99久久亚洲精品| 日本黄色福利视频| 椎名由奈av一区二区三区| 国产日韩欧美一区二区东京热| 久久精品最新地址| 欧美影院在线| 日韩一级片一区二区| 成人中文字幕在线| 中文字幕一区二区三区手机版| 精品国产伦一区二区三区免费| 黄页网站在线| 国产亚洲精品美女久久久m| 在线国产欧美| 久久无码人妻精品一区二区三区 | 欧美精品一区二区三区蜜臀| 欧美寡妇性猛交xxx免费| 国产视频在线观看一区| 国产精品视频| 日韩精品无码一区二区三区久久久 | 欧美一级黄色网| 美日韩中文字幕| 国产嫩草在线观看| 亚洲欧美区自拍先锋| 亚洲女人18毛片水真多| 69av视频在线播放| 欧美日韩性在线观看| 超碰在线资源站| 亚洲综合在线免费观看| 色鬼7777久久| 国产精品视频xxx| 中文字幕免费精品| 喷水视频在线观看| 欧美这里有精品| jizz性欧美10| 精品日韩电影| 美女国产一区二区三区| 久久综合亚洲色hezyo国产| 亚洲美女久久久| 香蕉久久久久久| 国产美女主播在线播放 |