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

如何在代碼中應用設計模式?

開發 前端
因為我們的項目的需求是永遠在變的,為了應對這種變化,使得我們的代碼能夠輕易的實現解耦和拓展。如果能夠保證代碼一次寫好以后都不會再改變了,那可以想怎么寫怎么寫了。

 為什么要使用設計模式

因為我們的項目的需求是永遠在變的,為了應對這種變化,使得我們的代碼能夠輕易的實現解耦和拓展。如果能夠保證代碼一次寫好以后都不會再改變了,那可以想怎么寫怎么寫了。

[[320551]]

如何判斷那里需要使用設計模式

 

在我們實現中,有一些代碼是一次寫好后續基本不會改變的,或者不太需要擴展的,比如一些工具類等。有一部分是會經常變得,設計模式大多都應用在需求會變化的這一部分。分析這些代碼會如何變,選擇合適的設計模式來優化這部分代碼。

以促銷活動需求為例

需求

為了促進商品的銷售,各大電商品臺會在平時或者一些節日的時候退出一些促銷活動刺激用戶消費,活動的類型可能會各不相同,如下:

  • 滿減,滿400減20
  • 代金卷,瑪莎拉蒂5元代金卷
  • 折扣,9折,8折
  • 每滿減,每滿200減10
  • 等等

其中有些可以疊加,有些只能單獨使用。

簡單實現

上面的需求看起來還是比較簡單的,但是如果考慮到我們是不可能一次定義好所有的促銷活動類型,后續我們可能會隨時都添加新的類型,要保證能夠簡單的實現功能擴展,那就比較麻煩了。Spring 框架用到的 9 個設計模式匯總,這個你知道嗎?

先拿到需求的時候,也不用去想那么多,挽起袖子就是一通操作:

 

  1. public class OrderPromotion {   
  2.    
  3.     public BigDecimal promotion(Order order, int[] promotions){   
  4.         for(int promotion:promotions){   
  5.             switch (promotion){   
  6.                 case 1:   
  7.                     //計算該類型折扣后的價格   
  8.                     break;   
  9.                 case 2:   
  10.                     //計算該類型折扣后的價格   
  11.                     break;   
  12.                 case 3:   
  13.                     //計算該類型折扣后的價格   
  14.                     break;   
  15.                 //....   
  16.             }   
  17.         }   
  18.         return order.getResultPrice();   
  19.     }   

 

單從功能實現上來說,上面的代碼已經完成了基本功能了。

但是上面的代碼也是致命的,雖然看起來很簡單,但是那只不過是因為大多數功能都用注釋代替了,換成實際代碼的話一個方法可能就得上千行。

尤其是當我們需要添加新的促銷活動的話就需要在switch中添加新的類型,這對于開發來說簡直是災難,并且維護這些代碼也是一個麻煩。

優化一:單一職責原則

上面的代碼中,promotion(…)方法直接完成了所有的工作,但是咋我們實際實現中最好讓一個方法的職責單一,只完成某一個功能,所以這里我們將對折扣類型的判斷和計算價格分開:

 

  1. public class OrderPromotion {   
  2.    
  3.     public BigDecimal promotion(Order order, int[] promotions){   
  4.         for(int promotion:promotions){   
  5.             switch (promotion){   
  6.                 case 1:   
  7.                     calculate1(order);   
  8.                     break;   
  9.                 case 2:   
  10.                     calculate2(order);   
  11.                     break;   
  12.                 case 3:   
  13.                     calculate3(order);   
  14.                     break;   
  15.                 //more promotion   
  16.             }   
  17.         }   
  18.         return order.getResultPrice();   
  19.     }   
  20.    
  21.     public void calculate1(Order order){   
  22.         //計算使用折扣一后的價格   
  23.     }   
  24.    
  25.     public void calculate2(Order order){   
  26.         //計算使用折扣二后的價格   
  27.     }   
  28.    
  29.     public void calculate3(Order order){   
  30.         //計算使用折扣三后的價格   
  31.     }   
  32.    
  33.     //more calculate   
  34.    

 

這里我們將折扣類型的判斷和計算價格分開,使得promotion(…)方法的代碼量大大降低,提升了代碼的可讀性。面象對象設計6大原則之一:單一職責原則,這篇也推薦大家看下。

優化二:策略模式

上面優化后的代碼提升了原有代碼的可讀性,但是原來OrderPromotion類代碼大爆炸的問題還是沒有解決。

針對這個問題,我們希望能夠將計算的代碼和當前代碼分離開,首先我們能想到的就是定義一個類,然后將計算的代碼復制到這個類中,需要的時候就調用。這樣到的確是分離開了,但是完全是治標不治本。在添加新的促銷活動是兩個類都要改。

所以我們希望能夠將不同的促銷活動的實現分離開,這樣對每一種活動的實現都是分開的,修改也不會影響其他的,基于此我們完全可以選擇策略模式來實現。

策略模式

策略模式的思想是針對一組算法,將每一種算法都封裝到具有共同接口的獨立的類中,從而是它們可以相互替換。策略模式的最大特點是使得算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。

 

 

 

 

 

  1. public class OrderPromotion {   
  2.    
  3.     public BigDecimal promotion(Order orderint[] promotions){   
  4.         for(int promotion:promotions){   
  5.             switch (promotion){   
  6.                 case 1:   
  7.                     new PromotionType1Calculate(order);   
  8.                     break;   
  9.                 case 2:   
  10.                     new PromotionType1Calculate(order);   
  11.                     break;   
  12.                 case 3:   
  13.                     new PromotionType1Calculate(order);   
  14.                     break;   
  15.                 //more promotion   
  16.             }   
  17.         }   
  18.         return order.getResultPrice();   
  19.     }   

 

上面的代碼很明顯已經精簡很多了,到了現在如果需要添加一個促銷活動的話只需定義一個促銷類,實現PromotionCalculation接口然后在switch中添加即可。

優化三:工廠模式

上面的代碼雖然已經將促銷活動的實現分離開了,但是OrderPromotion還是一直在變得,每一次添加或者下線活動都需要修改該類。

現在我們希望OrderPromotion是不變的,將PromotionCalculation的實例化剝離開來。創建類很明顯是使用工廠設計模式了。

OrderPromotion

 

  1. public class OrderPromotion {   
  2.    
  3.     public BigDecimal promotion(Order orderint[] promotions){   
  4.         for(int promotion:promotions){   
  5.             PromotionFactory.getPromotionCalculate(promotion).calculate(order);   
  6.         }   
  7.         return order.getResultPrice();   
  8.     }   

 

類的創建工作交給工廠來實現。

 

  1. public class PromotionFactory {   
  2.    
  3.     public static PromotionCalculate getPromotionCalculate(int promotion){   
  4.         switch (promotion){   
  5.             case 1:   
  6.                 return new PromotionType1Calculate(order);   
  7.             break;   
  8.             case 2:   
  9.                 return new PromotionType1Calculate(order);   
  10.             break;   
  11.             case 3:   
  12.                 return new PromotionType1Calculate(order);   
  13.             break;   
  14.             //more promotion   
  15.         }   
  16.         return null;   
  17.     }   

 

使用工廠模式后OrderPromotion類就不需要改了,每一次添加新的促銷活動后只需要在工廠類中添加即可。

優化四:配置+反射

上面的代碼還存在的問題在于每一次需要添加新的促銷活動的時候還是需要修改工廠類中的代碼,這里我們通過配置文件加反射的方式來解決。

定義映射配置文件

mapping.properties

 

  1. 1=design.order.PromotionType1Calculate   
  2. 2=design.order.PromotionType2Calculate   
  3. 3=design.order.PromotionType3Calculate 

 

PromotionFactory

 

  1. public class PromotionFactory {   
  2.    
  3.     private static Map<Integer, String> mapping = new HashMap<Integer, String>();   
  4.    
  5.     static {   
  6.         try {   
  7.             Properties pps = new Properties();   
  8.             pps.load(new FileInputStream("Test.properties"));   
  9.             Iterator<String> iterator = pps.stringPropertyNames().iterator();   
  10.             while(iterator.hasNext()){   
  11.                 String key=iterator.next();   
  12.                 mapping.put(Integer.valueOf(key), pps.getProperty(key));   
  13.             }   
  14.         } catch (IOException e) {   
  15.             e.printStackTrace();   
  16.         }   
  17.     }   
  18.    
  19.     public static PromotionCalculate getPromotionCalculate(int promotion) throws Exception {   
  20.         if(mapping.containsKey(promotion)){   
  21.             String beanName = mapping.get(promotion);   
  22.             return Class.forName(beanName).newInstance();   
  23.         }   
  24.         return null;   
  25.     }   

 

通過上面的代碼就可以實現不改變已有代碼的前提下實現對功能的靈活擴展。當然,這里的代碼只是作為演示用的,實際上可以改進的地方還有不少,像最后反射效率較低,也可以通過其他的方式來實現。

小結

設計模式是我們一定要了解的東西,熟悉設計模式能讓我們設計出易于擴展和維護的代碼結構。但是并不是任何地方都需要上設計模式,應該結合我們的項目實際進行分析是否需要設計模式,使用哪種設計模式。

 

責任編輯:華軒 來源: 博客園
相關推薦

2021-07-02 20:37:19

Python代碼SRP

2022-05-20 08:09:18

設計模式后端代碼

2022-05-30 11:04:09

云計算多云模式

2009-07-15 18:14:46

學習Jython

2021-09-03 09:06:42

代碼時間開發

2014-04-23 13:13:59

OpenShift

2024-12-03 08:00:00

2009-06-02 10:02:50

eclipse jboeclipse jbojboss for e

2023-01-01 23:42:22

React框架暗黑模式

2020-12-07 13:23:07

LibreOffice開源

2009-06-25 15:54:18

設計模式EJB

2022-07-15 09:01:15

React對象編程

2017-04-13 10:46:14

Webpack執行代碼分割

2024-04-01 00:00:00

AnsibleJenkins應用程序

2022-05-31 08:49:02

Flutter應用程序前端

2013-03-13 10:17:50

混合云混合云模式構建混合云

2019-10-30 13:52:49

Windows 10電源模式Windows

2021-07-28 08:31:25

設計系統應用

2022-09-16 07:33:52

瀏覽器深色模式Firefox

2019-07-19 09:12:50

Windows 10平板電腦模式Windows
點贊
收藏

51CTO技術棧公眾號

97久久人国产精品婷婷| 成年人在线观看av| 日本天码aⅴ片在线电影网站| 国产剧情一区二区| 欧美一级大片在线免费观看| 国产午夜精品福利视频| 亚洲午夜免费| 日本高清无吗v一区| 欧美日韩一区二区三区电影| 视频二区在线观看| 麻豆成人精品| 九九九久久久久久| 中文字幕被公侵犯的漂亮人妻| 精品国产第一国产综合精品| 懂色av一区二区三区| 色姑娘综合av| 人妻少妇一区二区三区| 另类综合日韩欧美亚洲| 91国内免费在线视频| x99av成人免费| 国语对白做受xxxxx在线中国| 免费黄色在线网站| 91美女在线观看| 2022国产精品| 亚洲天堂男人网| av成人天堂| 色综合久久88| 亚洲色图欧美色| 免费观看不卡av| 欧美videossexotv100| 九色porny自拍| 欧美黑人巨大xxxxx| 亚洲午夜电影在线| 国产一级大片免费看| 日本一本草久在线中文| 成人黄色av电影| 91精品天堂| 97精品人妻一区二区三区| 亚洲尤物影院| 97婷婷涩涩精品一区| 欧美国产日韩在线观看成人| 日韩免费av| 国产亚洲精品va在线观看| av无码一区二区三区| 色播一区二区| 日韩一区二区高清| 国产传媒免费观看| 久久久加勒比| 欧美高清视频一二三区| 国产成人无码av在线播放dvd| 黑森林国产精品av| 亚洲电影第三页| 丁香花在线影院观看在线播放| 国产剧情在线| 一区二区三区在线视频免费观看 | 男人添女人下面高潮视频| 97影院秋霞午夜在线观看| 中文字幕制服丝袜成人av| 亚洲欧美日韩精品久久久| 国产尤物视频在线| 国产日韩欧美麻豆| 亚洲午夜精品一区二区三区| 日韩三级影院| 亚洲视频精选在线| 在线观看成人免费| gogo久久| 欧美视频中文在线看| 毛片av免费在线观看| 亚洲综合在线电影| 在线成人免费视频| 韩国黄色一级片| 里番精品3d一二三区| 亚洲精品中文字幕有码专区| 99精品全国免费观看| 欧美国产偷国产精品三区| 欧美成人国产va精品日本一级| 69av视频在线| 今天的高清视频免费播放成人| 97高清免费视频| 国产女主播喷水视频在线观看| 免费看欧美美女黄的网站| 91免费人成网站在线观看18| 午夜精品久久久久久久99老熟妇| 99亚偷拍自图区亚洲| 日本午夜精品一区二区三区| 9191在线| 亚洲v精品v日韩v欧美v专区| 可以免费观看av毛片| 亚洲精品伊人| 亚洲黄色av网站| 波多野结衣一二三四区| 欧美1级日本1级| 日本免费久久高清视频| 国产精品视频无码| 国产乱码精品一区二区三区忘忧草 | 亚洲欧洲日产国产网站| 麻豆一区在线观看| 亚洲经典在线看| 国产日产久久高清欧美一区| 色呦呦中文字幕| 国产精品毛片高清在线完整版| 欧美a级免费视频| 日韩成人影音| 日韩久久精品一区| 91社区视频在线观看| 激情av一区| 国产乱肥老妇国产一区二| 亚洲黄色小说网| 中文字幕成人在线观看| 国产美女主播在线播放| 亚洲我射av| 亚洲丝袜在线视频| 国产亚洲成人av| 久久成人综合网| 久久久com| 日本动漫同人动漫在线观看| 欧美综合欧美视频| 小毛片在线观看| 一级毛片免费高清中文字幕久久网| 人人爽久久涩噜噜噜网站| 亚洲大尺度网站| 国产精品亲子伦对白| 国产日产欧美视频| 超碰精品在线观看| 久久亚洲一区二区三区四区五区高| 久久久久99精品成人片我成大片 | 免费黄色网页在线观看| 欧美日韩在线第一页| 亚洲成人精品在线播放| 99久久99视频只有精品| 国产精品黄视频| 免费人成在线观看网站| 婷婷综合另类小说色区| xxxx国产视频| 欧美黄色大片网站| 亚洲aⅴ男人的天堂在线观看| 亚洲1卡2卡3卡4卡乱码精品| 91福利国产成人精品照片| 欧美做受喷浆在线观看| 亚洲经典三级| 国产一级特黄a大片99| 色老头在线观看| 欧美一区二区三区色| 天天做夜夜爱爱爱| 久久草av在线| 一区二区三区免费看| 99只有精品| 中文字幕亚洲自拍| 亚洲天堂中文在线| 中文字幕一区二区三区av| the porn av| 日韩午夜电影网| 国产免费一区视频观看免费| 午夜在线免费观看视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| aaaaa级少妇高潮大片免费看| 国产日韩1区| 欧美精品一区二区三区久久| 网友自拍亚洲| 这里精品视频免费| 亚洲一级视频在线观看| 亚洲三级电影网站| 国产人妻精品午夜福利免费| 野花国产精品入口| 欧美日韩在线不卡一区| 99久久精品一区二区成人| 中文字幕亚洲欧美一区二区三区| 一道本无吗一区| 亚洲美女在线国产| 欧美双性人妖o0| 久久xxxx| 一本久道久久综合| 日韩精品久久久久久久软件91| 欧美激情精品久久久久久蜜臀| 人妻妺妺窝人体色www聚色窝| 欧美三级欧美成人高清www| 丰满的亚洲女人毛茸茸| 久久电影网电视剧免费观看| 国产aaa免费视频| 伊人成综合网yiren22| 国产精品精品一区二区三区午夜版| av大片在线看| 精品人在线二区三区| caoporn国产| 亚洲免费在线播放| 99久久人妻无码中文字幕系列| 日韩精品国产欧美| 一本大道东京热无码aⅴ| 日韩系列在线| 成人中文字幕在线观看| www.九色在线| 丝袜美腿亚洲一区二区| 亚洲成人第一区| 欧美影院精品一区| 538精品在线观看| 欧美国产日产图区| 日本少妇xxxx软件| 男女男精品视频| 九九爱精品视频| 99久久九九| 久久综合狠狠综合久久综青草| 亚洲精品成人一区| 奇米4444一区二区三区| 日本精品600av| 色噜噜狠狠狠综合曰曰曰| 天天插天天干天天操| 欧美一级午夜免费电影| 男人天堂视频在线| 亚洲大片精品永久免费| 日韩在线中文字幕视频| 97久久超碰国产精品电影| 天天综合成人网| 青娱乐精品视频| 男人日女人下面视频| 欧美成人一品| 亚洲午夜精品久久| 国产va免费精品观看精品视频 | 日本免费不卡视频| 7777精品伊人久久久大香线蕉经典版下载 | 性xxxfllreexxx少妇| 欧美亚洲免费| 亚洲欧洲免费无码| 国产成人黄色| 久久99蜜桃综合影院免费观看| av国产精品| 国产精品欧美激情| 日韩美女在线看免费观看| 欧美精品videos性欧美| 26uuu亚洲电影在线观看| 中文字幕亚洲综合久久| 国模精品一区二区| 亚洲精品aⅴ中文字幕乱码 | 日韩第一页在线| 色呦呦中文字幕| 精品av综合导航| 亚洲av无码片一区二区三区 | 日韩精品视频在线观看一区二区三区| 日韩欧美在线影院| 99热这里只有精品1| 欧美喷水一区二区| 中文字幕资源网| 欧美色窝79yyyycom| 亚洲性猛交富婆| 欧美午夜电影一区| 中文字幕日韩国产| 欧美日韩在线观看一区二区| 亚洲av综合一区| 欧美性生活一区| 在线播放一级片| 欧美日韩高清影院| 97国产成人无码精品久久久| 69堂亚洲精品首页| 国产av无码专区亚洲av| 日韩欧美黄色影院| 亚洲精品无码久久久| 精品国偷自产国产一区| 天堂在线资源8| 亚洲精品视频在线播放| 毛片免费在线播放| 揄拍成人国产精品视频| 欧美jizz18性欧美| 欧美成在线观看| av日韩中文| 2023亚洲男人天堂| 台湾佬成人网| 国产日韩欧美在线| 日韩在线成人| 久久久精品动漫| 成人久久电影| 欧美a级免费视频| 一本不卡影院| 国产av人人夜夜澡人人爽| 精品影院一区二区久久久| 亚洲少妇一区二区| 91丨九色porny丨蝌蚪| 国产成人一区二区在线观看| 亚洲天堂av老司机| 日韩av在线电影| 欧美在线观看一区| 99久久国产免费| 国产午夜精品理论片a级探花| 在线激情网站| 国语自产精品视频在线看| 午夜欧美巨大性欧美巨大| 成人激情视频在线观看| 国产精品白丝一区二区三区| 日产精品一线二线三线芒果| 亚洲精品国产成人影院| 免费观看日韩毛片| 九色porny丨国产精品| 在线免费播放av| 亚洲欧洲精品成人久久奇米网| 久久久全国免费视频| 91国产丝袜在线播放| 不卡视频在线播放| 一区二区欧美在线| 激情网站在线| 国产精品羞羞答答| 久久99国产精品久久99大师| 亚洲午夜精品福利| 久久久久国产一区二区| 美女又黄又免费的视频| 国产欧美一区二区三区鸳鸯浴| 久久久综合久久久| 欧美色图第一页| 视频一区二区三区国产| 理论片在线不卡免费观看| 欧美日韩精品免费观看视完整| aaa级精品久久久国产片| 不卡av一区二区| 欧美国产亚洲一区| 国产a久久麻豆| 啪啪一区二区三区| 色久综合一二码| 手机在线不卡av| 欧美日韩国产成人| 亚洲伊人精品酒店| 日韩在线观看电影完整版高清免费| 亚洲大胆在线| 蜜桃视频无码区在线观看| 中文字幕av一区二区三区免费看| 看片网址国产福利av中文字幕| 日韩欧美国产一区二区在线播放 | 性色av一区二区三区| 国产一区一区| 亚洲精品在线免费| 久久这里只有| 精品无码人妻一区| 韩曰欧美视频免费观看| 午夜久久久久久久久久| 久久久精品久久| 亚洲欧洲一二区| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 久久久久久久欧美精品| 亚洲最大的黄色网| 午夜亚洲福利老司机| 狠狠综合久久av一区二区| 欧美另类第一页| 国产精品毛片无码| 桥本有菜av在线| 精品一区二区在线视频| 国产福利在线导航| 欧美午夜电影一区| 欧美尤物美女在线| 国产日韩换脸av一区在线观看| 欧美少妇性xxxx| 日日噜噜噜噜久久久精品毛片| 国产日韩精品久久久| www.日韩一区| 中文字幕免费精品一区高清| 国产69精品久久久久按摩| 一级做a爰片久久| 激情国产一区二区| 国产精品九九九九九九| 日韩精品一区二区三区在线| 精精国产xxxx视频在线中文版| 国产区一区二区三区| 亚洲综合二区| 成人一级片免费看| 91 com成人网| 色婷婷av在线| 久久精品五月婷婷| 日韩va欧美va亚洲va久久| 日韩亚洲欧美中文字幕| 欧美一级免费大片| 国产理论在线| 日本一区二区三区视频在线观看 | 欧美高清视频www夜色资源网| 成人video亚洲精品| 国产精品一区二区三区精品| 亚洲深夜激情| 任你操精品视频| 精品日韩欧美在线| 国产精品粉嫩| 国产成年人在线观看| 不卡的av网站| 国产精品第6页| 久久久久久久久综合| 精品一二三区| 成人在线短视频| 日韩欧美有码在线| 蜜桃视频在线观看免费视频网站www| 91香蕉视频在线下载| 国产精品久久国产愉拍| 国产又粗又猛又爽又黄的视频小说| 欧美一区二区三区小说| 色是在线视频| 四虎影院一区二区| 97se亚洲国产综合自在线观| 亚洲性在线观看| 2019亚洲男人天堂| 91精品国偷自产在线电影| 182在线视频| 在线成人av网站| 黄在线观看免费网站ktv| 在线国产精品网| 97se狠狠狠综合亚洲狠狠| 国产又粗又猛又色又| 4438全国成人免费| 欧美成人69av|