阿里架構(gòu)師工作十年接觸過Java框架設(shè)計(jì)模式(未完待續(xù))

一激涤、前言

說起來設(shè)計(jì)模式,大家應(yīng)該都耳熟能詳判呕,設(shè)計(jì)模式代表了軟件設(shè)計(jì)的最佳實(shí)踐倦踢,是經(jīng)過不斷總結(jié)提煉出來的代碼設(shè)計(jì)經(jīng)驗(yàn)的分類總結(jié),這些模式或者可以簡化代碼侠草,或者可以是代碼邏輯開起來清晰辱挥,或者對功能擴(kuò)展很方便…。

設(shè)計(jì)模式按照使用場景可以分為三大類:創(chuàng)建型模式(Creational Patterns)边涕、結(jié)構(gòu)型模式(Structural Patterns)晤碘、行為型模式(Behavioral Patterns)。

創(chuàng)建型模式(Creational Patterns)

對對象的實(shí)例化過程進(jìn)行抽象功蜓,這使得一個(gè)系統(tǒng)可以不用關(guān)心這些對象是如何創(chuàng)建园爷,組合,呈現(xiàn)的式撼,對于類創(chuàng)建模式來說通過使用繼承改變實(shí)例化的類童社,對于對象創(chuàng)建模式來說通過使用代理來實(shí)例化所需要的對象。

結(jié)構(gòu)型模式(Structural Patterns)

通過對多個(gè)類和對象進(jìn)行組合得到復(fù)雜結(jié)構(gòu)的類著隆,一般使用繼承繼承或者成員變量引用形式來實(shí)現(xiàn)扰楼。

行為型模式(Behavioral Patterns)

行為模式不僅表達(dá)了對象和類呀癣,還表達(dá)了他們之間的交互,涉及到了對象和算法的分配弦赖。

下面就帶大家看下開源框架框架中是如何應(yīng)用這些經(jīng)典設(shè)計(jì)模式的项栏。

二、責(zé)任鏈設(shè)計(jì)模式(Chain of Responsibility Pattern)

2.1 介紹

責(zé)任鏈模式是把多個(gè)對象串聯(lián)起來形成一個(gè)鏈狀結(jié)構(gòu)蹬竖,讓每個(gè)對象都有機(jī)會(huì)對事件發(fā)送者的請求進(jìn)行處理沼沈。責(zé)任鏈模式是設(shè)計(jì)模式中的行為模式,設(shè)計(jì)意圖是為了使事件發(fā)送者和事件接受者之間解耦币厕。通常責(zé)任鏈鏈中的每個(gè)對象都有下一個(gè)對象的引入(例如tomcat 里面StandardPipeline用來管理valve)庆冕,或者有個(gè)同一個(gè)鏈管理工廠里面使用數(shù)組存放了所有的對象(例如tomcat里面ApplicationFilterChain用來關(guān)系filter)。

2.2 Tomcat中Valve鏈

Tomcat中StandardEngine,StandardHost,StandardContext里面都有自己StandardPipeline,下面以StandardEngine里面StandardPipeline為例講解

image.png

從上面類圖可知道每個(gè)Valve都要繼承ValveBase類央渣,該類里面有一個(gè)Valve的引用入录,實(shí)際是鏈中下一個(gè)節(jié)點(diǎn)對象,Valve就是通過每個(gè)Valve里面的next串聯(lián)為鏈的。

每個(gè)valve的invoke方法里面調(diào)用next.invoke激活鏈中下一個(gè)節(jié)點(diǎn),并且StandardEngine,StandardHost,StandardContext都有一個(gè)basic valve這個(gè)valve在鏈的末尾用來激活子容器的valve鏈镶殷。

2.3 Tomcat中Filter鏈

Tomcat中Filter鏈?zhǔn)鞘褂肁pplicationFilterChain來管理的,具體結(jié)構(gòu)如下圖:

可知Filter鏈不是像Valve一樣在內(nèi)部維護(hù)下個(gè)節(jié)點(diǎn)的引用恋拷,而是在ApplicationFilterChain中搞了個(gè)數(shù)組存放所有的Filter准给,并通過n統(tǒng)計(jì)Filter總個(gè)數(shù),pos是當(dāng)前filter的下標(biāo)描滔。

ApplicationFilterChain的doFilter代碼如下:

public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { ... internalDoFilter(request,response); ... }private void internalDoFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { // Call the next filter if there is one if (pos < n) { //獲取filter鏈中下標(biāo)為pos的filter ApplicationFilterConfig filterConfig = filters[pos++]; Filter filter = null; try { filter = filterConfig.getFilter(); support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT, filter, request, response); if (request.isAsyncSupported() && "false".equalsIgnoreCase( filterConfig.getFilterDef().getAsyncSupported())) { request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE); } ... //調(diào)用自定義filter的dofilter方法 filter.doFilter(request, response, this); support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT, filter, request, response); } .... } .....}

注:這兩種方式的區(qū)別是啥,就是說那些場景下使用2.2棒妨,什么情況下使用2.3這個(gè)目前還沒有搞清楚有

知道的麻煩在本帖留言幫我解惑下^^

2.4 使用場景

當(dāng)一個(gè)請求需要

根據(jù)請求參數(shù)的不同由不同對象來處理時(shí)候。

當(dāng)一個(gè)請求需要固定對象順序處理含长,并且可擴(kuò)展性的在固定順序里面插入新的對象進(jìn)行處理時(shí)候券腔。

三、工廠模式(Factory Pattern)

3.1 介紹

工廠模式是創(chuàng)建型模式拘泞,他封裝了對象的創(chuàng)建過程纷纫,調(diào)用者使用具體的工廠方法根據(jù)參數(shù)就可以獲取對應(yīng)的對象。

3.2 Spring框架中BeanFactory

如圖BeanFactory接口提供了getBean方法陪腌,在AbstractBeanFactory中實(shí)現(xiàn)了該方法辱魁,經(jīng)過層層繼承,實(shí)現(xiàn)诗鸭,最后DefaultListableBeanFactory實(shí)現(xiàn)了BeanDefinitionRegistry接口用來保存bean定義染簇,繼承了AbstractAutowireCapableBeanFactory用來支撐autowired。

一個(gè)例子

@Testpublic void testBeanFactoy() throws NamingException, SQLException, ParseException, IOException { //創(chuàng)建Bean工廠 DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); //給bean工廠添加bean定義,解析xml里面的bean放入bean工廠 loadBeanDefinitions(bf); //根據(jù)名字從bean工廠獲取bean Hello hello = (Hello) bf.getBean("hello"); hello.sayHello(); Hello2 hello2 = (Hello2) bf.getBean("hello2"); hello2.sayHello();}protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException { XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); String[] configLocations = new String[] { "beans2.xml" }; if (configLocations != null) { beanDefinitionReader.loadBeanDefinitions(configLocations); }}

3.3 使用場景

不同條件下創(chuàng)建不同實(shí)例强岸,用于統(tǒng)一管理bean

不同條件下調(diào)用不同工廠方法獲取不同場景下的bean

總結(jié)

設(shè)計(jì)模式中每一個(gè)模式都描述了在我們工作中不斷重復(fù)發(fā)生的問題锻弓,以及問題的解決方案,所以真正掌握設(shè)計(jì)模式可以避免我們做不必要的重復(fù)勞動(dòng)蝌箍。如果你在學(xué)習(xí)Java的過程中或者在工作中遇到什么問題都可以來群里提問弥咪,阿里Java高級大牛直播講解知識點(diǎn)过蹂,分享知識,多年工作經(jīng)驗(yàn)的梳理和總結(jié)聚至,帶著大家全面酷勺、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!JAVA學(xué)習(xí)交流QQ群:288351179可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦! 非喜勿入扳躬!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脆诉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贷币,更是在濱河造成了極大的恐慌击胜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件役纹,死亡現(xiàn)場離奇詭異偶摔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)促脉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門辰斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘸味,你說我怎么就攤上這事宫仗。” “怎么了旁仿?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵藕夫,是天一觀的道長。 經(jīng)常有香客問我枯冈,道長毅贮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任尘奏,我火速辦了婚禮嫩码,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罪既。我一直安慰自己铸题,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布琢感。 她就那樣靜靜地躺著丢间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驹针。 梳的紋絲不亂的頭發(fā)上烘挫,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼饮六。 笑死其垄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卤橄。 我是一名探鬼主播绿满,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窟扑!你這毒婦竟也來了喇颁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嚎货,失蹤者是張志新(化名)和其女友劉穎橘霎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殖属,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姐叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洗显。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外潜。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墙懂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扮念,我是刑警寧澤损搬,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站柜与,受9級特大地震影響巧勤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弄匕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一颅悉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迁匠,春花似錦剩瓶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亡哄,卻和暖如春枝缔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚊惯。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工愿卸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灵临,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓趴荸,卻偏偏與公主長得像儒溉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子赊舶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一睁搭、前言 說起來設(shè)計(jì)模式,大家應(yīng)該都耳熟能詳笼平,設(shè)計(jì)模式代表了軟件設(shè)計(jì)的最佳實(shí)踐园骆,是經(jīng)過不斷總結(jié)提煉出來的代碼設(shè)計(jì)經(jīng)...
    Java架構(gòu)閱讀 2,353評論 0 11
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)寓调,斷路器锌唾,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 早上7點(diǎn)醒來,繼續(xù)啟動(dòng)例外模式夺英,收拾完畢行李晌涕,早餐,9點(diǎn)出發(fā)去摘車?yán)遄油疵酰瑡善G欲滴的車?yán)遄硬粌H僅好吃看著也是讓人賞心...
    溫柔如春風(fēng)閱讀 182評論 0 0
  • 今天上午民族中學(xué)全體社會(huì)教師對邱老師在民族上的兩節(jié)課再次認(rèn)真探討余黎。 《統(tǒng)一的多民族的國家》 環(huán)節(jié)一:統(tǒng)一是什么? ...
    如肅閱讀 190評論 0 1