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

一次代碼優化實踐,用了模板方法+策略+工廠方法模式

開發 前端
好久沒分享工作總結啦,今天來一份代碼優化總結。用模板方法+策略+工廠方法模式優化了代碼,耐心點看完,應該對大家有幫助的~

[[343344]]

前言

好久沒分享工作總結啦,今天來一份代碼優化總結。用模板方法+策略+工廠方法模式優化了代碼,耐心點看完,應該對大家有幫助的~

本文已經收錄到github

https://github.com/whx123/JavaHome

優化代碼前

先來了解一下類似的業務場景,簡言之,就是:多個商戶接入我們系統,都是走一個類似的流程通過http請求出去的。

優化前,每個公司對應一個句柄服務,偽代碼如下:

  1. // 商戶A處理句柄 
  2. CompanyAHandler implements RequestHandler { 
  3.    Resp hander(req){ 
  4.    //查詢商戶信息 
  5.    queryMerchantInfo(); 
  6.    //加簽 
  7.    signature(); 
  8.    // http請求(走代理) 
  9.    httpRequestbyProxy() 
  10.    // 驗簽 
  11.    verify(); 
  12.    } 
  13. // 商戶B處理句柄 
  14. CompanyBHandler implements RequestHandler { 
  15.    Resp hander(Rreq){ 
  16.    //查詢商戶信息 
  17.    queryMerchantInfo(); 
  18.    //加簽 
  19.    signature(); 
  20.    // http請求(不走代理) 
  21.    httpRequestbyDirect(); 
  22.    // 驗簽 
  23.    verify();  
  24.    } 
  25. // 商戶C處理句柄 
  26. CompanyBHandler implements RequestHandler { 
  27.    Resp hander(Rreq){ 
  28.    //查詢商戶信息 
  29.    queryMerchantInfo(); 
  30.    // webservice 方式調用 
  31.    requestByWebservice(); 
  32.    } 

優化代碼思路

我的優化代碼思路,是有「重復代碼,先把它抽出來,或者公用變量,或者公用方法,伸著公用類」。所以呢,查詢商戶信息呀,加簽呀,http請求呀先全部各抽成一個公用方法。你細心點會發現,連每個Handler處理過程都很類似的,大概都是查詢商戶信息+加簽+http請求+驗簽,于是呢,可以直接把它們抽象成一個公用類呀~在這里就要引入模板方法模式咯

模板方法模式

  1. 在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。 
  2. 這種類型的設計模式屬于行為型模式。 

這種類型的設計模式屬于行為型模式。

既然每個Handler處理,都是類似的流程,那「定義一個抽象類,把查詢商戶信息,加簽,http請求,驗簽什么的,都放到里面去,儼然一個模板一樣」。然后,因為有些商戶走http代理,有些又沒走代理,怎么辦呢? 定義「一個抽象方法,給子類實現」嘛,因為能共用就放到父類(當前的抽象類),不能共用就放到子類嘛~代碼如下:

  1. abstract class AbstractCompanyCommonService implements ICompanyCommonService {  
  2.      //模板方法 
  3.      Resp handlerTempPlate(req){ 
  4.             //查詢商戶信息 
  5.            queryMerchantInfo(); 
  6.            // 加簽 
  7.            signature(); 
  8.            //http 請求 
  9.            if(isRequestByProxy()){ 
  10.               httpProxy(); 
  11.             }else
  12.               httpDirect(); 
  13.              } 
  14.             // 驗簽 
  15.             verifySinature(); 
  16.      } 
  17.       // Http是否走代理 
  18.       abstract boolean isRequestByProxy(); 

子類商戶A實現:

  1. CompanyAServiceImpl extends AbstractCompanyCommonService{ 
  2.     Resp hander(req){ 
  3.       return handlerTempPlate(req); 
  4.     } 
  5.     //公司A是走代理的 
  6.     boolean isRequestByProxy(){ 
  7.        return true
  8.     } 

子類商戶B實現:

  1. CompanyBServiceImpl extends AbstractCompanyCommonService{ 
  2.     Resp hander(req){ 
  3.       return handlerTempPlate(req); 
  4.     } 
  5.     //公司B是不走代理的 
  6.     boolean isRequestByProxy(){ 
  7.        return false
  8.     } 

策略模式

心細的讀者會發現,甚至提出疑問,「你的商戶C的服務實現跟你定義的公用模板,不太一樣呢」,那當然,實際開發中,不跟你定義的模板一樣太常見了,需求是產品提的嘛,又不是根據你模板提的,是代碼服務于需求的。好了,不多說啦,我使用了策略模式,來優化這個問題。

  1. 在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。 

策略模式理解起來其好抽象對不對?我個人理解,其實策略模式就是定義一個方法(所謂算法),給子類自己去實現。實際上就是「定義個方法/接口,讓子類自己去實現」。看代碼吧:

  1. // 定義一個方法,把策略交給子類去實現。 
  2. interface ICompanyCommonService{ 
  3.   Resp hander(req); 

前面商戶A和商戶B還是不變,使用抽象類AbstractCompanyCommonService的模板,模板不滿足商戶C,商戶C只能自己去實現咯,各個子類自己去實現的行為,就是策略模式的體現呢,如下:

  1. CompanyCServiceImpl extends AbstractCompanyCommonService{ 
  2.     Res hander(req){ 
  3.        //查詢商戶信息 
  4.        queryMerchantInfo(); 
  5.        requestByWebservice();     
  6.     } 
  7.     //隨意了,你都不走模板了 
  8.     boolean isRequestByProxy(){ 
  9.        return false
  10.     } 

工廠方法模式

商戶A、B、C服務怎么被管理呢,之前分別給A,B,C服務實現handler的,現在好了,都不知道怎么管理了,怎么知道調用哪個呢?別慌,解決方案是「工廠方法模式」。

  1. 在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象。 

工廠方法模式具體實現就是:接口定義一個枚舉,每個服務實現都重新實現枚舉,設置唯一標志枚舉,再交給spring容器管理。看代碼咯:

  1. interface ICompanyCommonService{ 
  2.   Resp hander(req); 
  3.   CompanyEnum getCompanyEnum(); 
  4.  
  5. CompanyAServiceImpl extends AbstractCompanyCommonService{ 
  6.     Resp hander(req){ 
  7.       return handlerTempPlate(req); 
  8.     } 
  9.     //公司A是走代理的 
  10.     boolean isRequestByProxy(){ 
  11.        return true
  12.     } 
  13.     CompanyEnum getCompanyEnum(){ 
  14.      return CompanyEnum.A; 
  15.     }  
  16.      
  17. CompanyBServiceImpl extends AbstractCompanyCommonService{ 
  18.     Resp hander(req){ 
  19.       return handlerTempPlate(req); 
  20.     } 
  21.     //公司B是不走代理的 
  22.     boolean isRequestByProxy(){ 
  23.        return false
  24.     } 
  25.     CompanyEnum getCompanyEnum(){ 
  26.      return CompanyEnum.B; 
  27.     }  

來來來,工廠方法模式出爐咯:

  1. @Component 
  2. public class CompanyServiceFactory implements ApplicationContextAware { 
  3.  
  4.     private static Map<CompanyEnum, ICompanyCommonService> map = new HashMap<>(); 
  5.  
  6.     @Override 
  7.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
  8.         Map<String, ICompanyCommonService> tempMap = applicationContext.getBeansOfType(ICompanyCommonService.class); 
  9.         tempMap.values().forEach(iCompanyCommonService -> 
  10.                 map.put(iCompanyCommonService.getCompanyEnum(), iCompanyCommonService)); 
  11.     } 
  12.  
  13.     public Resp handler(req) { 
  14.         return map.get(CompanyEnum.getCompanyEnum(req.getCompanyFlag()).hander(req); 
  15.     } 

最后建議

最后,不要為了使用設計模式生搬硬套,而是優化代碼過程中,發現這個設計模式剛好適用,才去用的哈。附上最后的代碼咯:

  1. @Service 
  2. public class CompanyHandler implements RequestHandler  { 
  3.    @Autowire 
  4.    private CompanyServiceFactory companyServiceFactory; 
  5.     
  6.    Resp hander(req){ 
  7.     return companyServiceFactory.handler(req); 
  8.   } 

本文轉載自微信公眾號「撿田螺的小男孩」,可以通過以下二維碼關注。轉載本文請聯系撿田螺的小男孩公眾號。

 

責任編輯:武曉燕 來源: 撿田螺的小男孩
相關推薦

2013-11-26 16:29:22

Android設計模式

2024-02-20 12:09:32

模式工廠方法接口

2010-10-09 09:25:35

Python工廠模式

2020-08-11 11:20:30

Typescript設計模式

2009-01-15 10:55:29

JavaScript設計模式抽象工廠

2023-09-11 08:30:30

Creator工廠方法

2021-03-02 20:42:20

實戰策略

2023-08-05 13:31:20

工廠方法模式對象

2023-11-06 07:45:42

單據圖片處理

2023-05-15 08:38:58

模板方法模式

2019-01-21 11:17:13

CPU優化定位

2023-10-27 08:34:46

PythonJava優勢

2024-02-21 12:24:33

模板設計模式框架

2023-12-12 11:09:55

模板方法模式python設計模式

2012-07-11 08:51:51

設計模式

2013-11-26 17:15:13

Android設計模式

2024-09-26 10:41:31

2021-07-16 23:01:03

SQL索引性能

2014-03-14 10:07:09

極限編程敏捷開發

2022-08-15 08:16:56

shiroWeb認證
點贊
收藏

51CTO技術棧公眾號

久久久这里只有精品视频| 天天干在线影院| 三年中国中文在线观看免费播放| 国产在线视频网| 欧美一区二区三区精品| 国产日韩精品一区二区| 粉嫩欧美一区二区三区| 亚洲一区二区三区| 日韩精品在线免费观看| 女人高潮特级毛片| 韩国亚洲精品| 欧美刺激午夜性久久久久久久| 国产高清不卡无码视频| 哺乳挤奶一区二区三区免费看| 久久中文娱乐网| 国产91对白在线播放| 欧美videos极品另类| 蜜桃视频在线一区| 欧美日韩国产中文精品字幕自在自线| 国产精品.com| 超碰国产精品一区二页| 精品国产户外野外| 国产高清www| 一区二区免费| 欧美一区二区三区白人| 亚洲精品综合久久中文字幕| 热久久精品免费视频| 国产亚洲人成网站| 亚洲精品视频一二三| 亚洲欧美日韩在线观看a三区| 亚洲综合中文字幕68页| 亚洲久久一区二区| 亚洲精品日韩成人| 国产成人午夜精品5599| 大陆极品少妇内射aaaaa| 久久久久青草大香线综合精品| 欧美精品无码一区二区三区| 亚洲日穴在线视频| 日本福利片高清在线观看| 色婷婷av一区二区三区软件| 无遮挡动作视频在线观看免费入口| 欧美日韩国产一级| 色老头在线一区二区三区| 亚洲男人天天操| 麻豆国产精品| 国产精品成人va在线观看| 欧美激情一区| 亚洲最新在线| heyzo一本久久综合| 色偷偷亚洲第一综合| 色综合色综合色综合| 羞羞的视频在线看| 中文在线资源观看视频网站免费不卡| 91精品视频一区二区| 国产精品第3页| 亚洲综合精品| 日韩免费毛片视频| 色老头久久综合| 午夜不卡影院| 国产精品成人久久久久| 亚洲在线播放| 国产v亚洲v天堂无码久久久| 欧美性猛交xxxxx免费看| 极品av在线| 日韩美女激情视频| 日韩激情av在线| 无码人妻精品一区二区三区66| 亚洲成人高清在线| 天堂中文在线播放| 色www精品视频在线观看| 日本视频在线免费观看| www.久久久久久.com| 9999国产精品| 亚洲亚洲精品三区日韩精品在线视频| 国产视频一区二区在线观看| www.亚洲免费| 不卡av电影院| 99日韩精品| 久久99爱视频| 欧美成人精品1314www| 亚洲亚洲一区二区三区| 好吊色欧美一区二区三区四区| 99视频热这里只有精品免费| 午夜激情视频在线| 国自在线精品视频| 激情五月婷婷综合网| 欧美孕妇性xxxⅹ精品hd| 裸体女人亚洲精品一区| 在线视频日韩| 最近最好的中文字幕2019免费| 亚洲欧美激情另类校园| 影音先锋日韩在线| 爱情岛论坛成人| 精品在线观看国产| 激情另类综合| 四虎影视av| 一区二区中文字幕| 999亚洲国产精| 一本色道久久加勒比88综合| 午夜精品偷拍| 成年人羞羞的网站| 最近2019中文字幕mv免费看| 免费视频久久| 国产精品一区二区婷婷| 国产成人av在线播放| 99精品视频一区二区三区| 三级资源在线| 精品在线一区| 日韩欧美在线视频日韩欧美在线视频| www欧美在线观看| 在线观看欧美亚洲| 欧美日韩午夜影院| 国产精品99久久精品| 1024亚洲| 欧美极品少妇xxxxx| 国产一区二区导航在线播放| 污视频在线免费观看网站| 国产精品二区在线观看| 午夜精品一区二区三区电影天堂| 精品亚洲a∨一区二区三区18| 自拍视频一区二区三区| 欧美一二三区在线观看| 精品999网站| 能在线看的av| 91久久综合亚洲鲁鲁五月天| 日韩毛片视频在线看| 亚洲精品a区| 无码精品a∨在线观看中文| 日韩精品在线免费| 国产一区二区三区在线观看免费| av资源中文在线| 日韩免费电影一区二区| 日韩视频一区二区三区| 老妇喷水一区二区三区| 欧美精品videossex少妇| 日本一区二区精品视频| 日韩美女一区二区三区四区| 亚洲乱码久久| 性欧美高清come| 超碰在线免费观看97| 日韩av网站在线| 国产精品一区久久久久| 大胆人体一区二区| www.av91| 欧美丰满片xxx777| 亚洲色图.com| 99re久久最新地址获取| 日本一区高清| 免费av一区二区三区| 精品国产伦一区二区三区观看方式 | 一区二区三区不卡在线观看 | 好男人看片在线观看免费观看国语| 97视频色精品| 一区二区三区在线视频观看| 日韩国产一区二区| 国产对白叫床清晰在线播放| 欧美亚洲一级二级| 精品一区二区三区四区| 91日韩在线专区| 国产精品一区二区av日韩在线| 黄色视屏网站在线免费观看| 三区精品视频观看| 中文字幕精品网| 亚洲精品国产一区二区精华液| 国内精品久久久久国产盗摄免费观看完整版| 国产乱色在线观看| 人妻无码久久一区二区三区免费| 欧美一级电影在线| 欧美精品少妇一区二区三区| 国产高清不卡二三区| 久草精品在线| 金瓶狂野欧美性猛交xxxx | 国产成人精品日本亚洲| 精品久久久视频| 精品一区二区免费| 天天躁日日躁狠狠躁欧美| 日p在线观看| 日韩毛片在线免费看| 国产精品精品一区二区三区午夜版 | 92精品国产成人观看免费| 狠狠v欧美v日韩v亚洲ⅴ| 久久久噜噜噜| 国产精品久久久久久久久久妞妞| 欧美日本一区二区高清播放视频| 婷婷久久一区| 视频一区二区不卡| caoporn国产一区二区| 久久99深爱久久99精品| 国产精品亚洲视频| 性欧美大战久久久久久久久| 国产999精品久久久久久| 欧美日韩亚洲一区二| 国产精品网站在线观看| 福利一区视频在线观看| 久久综合给合久久狠狠狠97色69| 久久精品道一区二区三区| 精品国产91乱码一区二区三区四区 | 国产成人精品免费视频大全最热 | 91在线你懂得| 在线成人直播|