最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

[轉(zhuǎn)載]依賴注入[2]: 基于IoC的設(shè)計(jì)模式

2021-08-19 15:40 作者:觴翊の澤  | 我要投稿

原創(chuàng)?大內(nèi)老A?大內(nèi)老A?2018-07-11

正如我們在《依賴注入[1]: 控制反轉(zhuǎn)》提到過的,很多人將IoC理解為一種“面向?qū)ο蟮脑O(shè)計(jì)模式”,實(shí)際上IoC自身不僅與面向?qū)ο鬀]有必然的聯(lián)系,它也算不上是一種設(shè)計(jì)模式。一般來講,設(shè)計(jì)模式提供了一種解決某種具體問題的方案,但是IoC既沒有一個(gè)針對性的問題領(lǐng)域,其自身沒有提供一種可實(shí)施的解決方案,所以我更加傾向于將IoC視為一種設(shè)計(jì)原則。實(shí)際上很多我們熟悉的設(shè)計(jì)模式背后采用了IoC原則,接下來我們就來介紹幾種典型的“設(shè)計(jì)模式”。

01模板方法

提到IoC,很多人首先想到的是DI,但是在我看來與IoC思想最為接近的倒是另一種被稱為“模板方法(Template? Method)”的設(shè)計(jì)模式。模板方法模式與IoC的意圖可以說不謀而合,該模式主張將一個(gè)可復(fù)用的工作流程或者由多個(gè)步驟組成的算法定義成模板方法,組成這個(gè)流程或者算法的步驟實(shí)現(xiàn)在相應(yīng)的虛方法之中,模板方法根據(jù)按照預(yù)先編排的流程去調(diào)用這些虛方法。所有這些方法均定義在同一個(gè)類中,我們可以通過派生該類并重寫相應(yīng)的虛方法達(dá)到對流程定制的目的。

對于《依賴注入[1]: 控制反轉(zhuǎn)》演示的這個(gè)MVC的例子,我們可以將整個(gè)請求處理流程實(shí)現(xiàn)在如下一個(gè)MvcEngine類中,請求的監(jiān)聽與接收、目標(biāo)Controller的激活與執(zhí)行以及View的呈現(xiàn)分別定義在5個(gè)受保護(hù)的虛方法中,模板方法StartAsync根據(jù)預(yù)定義的請求處理流程先后調(diào)用這5個(gè)方法。

對于具體的應(yīng)用來說,如果定義在MvcEngine針對請求的處理方式完全符合它的要求,它只需要?jiǎng)?chuàng)建這個(gè)一個(gè)MvcEngine對象,然后指定一個(gè)對應(yīng)的基地址調(diào)用模板方法StartAsync開啟這個(gè)MVC引擎即可。如果該MVC引擎處理請求的某個(gè)環(huán)節(jié)不能滿足它的要求,它可以創(chuàng)建MvcEngine的派生類,并重寫實(shí)現(xiàn)該環(huán)節(jié)的相應(yīng)虛方法即可。

比如說定義在某個(gè)應(yīng)用程序中的Controller都是無狀態(tài)的,它希望采用單例(Singleton)的方式重用已經(jīng)激活的Controller以提高性能,那么它就可以按照如下的方式創(chuàng)建一個(gè)自定義的FoobarMvcEngine并按照自己的方式重寫

02工廠方法

對于一個(gè)復(fù)雜的流程來說,我們傾向于將組成該流程的各個(gè)環(huán)節(jié)實(shí)現(xiàn)在相對獨(dú)立的組件之中,那么針對流程的定制就可以通過提供定制組件的方式來實(shí)現(xiàn)。我們知道23種設(shè)計(jì)模式之中有一種重要的類型,那就是“創(chuàng)建型模式”,比如常用的“工廠方法”和“抽象工廠”,IoC所體現(xiàn)的針對流程的共享與定制可以通過它們來完成。

所謂的工廠方法,說白了就是在某個(gè)類中定義用于提供依賴對象的方法,這個(gè)方法可以是一個(gè)單純的虛方法,也可以是具有默認(rèn)實(shí)現(xiàn)的虛方法,至于方法聲明的返回類型,可以是一個(gè)接口或者抽象類,也可以是未被封閉(Sealed)的具體類型。作為它的派生類型,它可以實(shí)現(xiàn)或者重寫工廠方法以提供所需的具體對象。

同樣以我們的MVC框架為例,我們讓獨(dú)立的組件來完成組成整個(gè)請求處理流程的幾個(gè)核心環(huán)節(jié)。具體來說,我們針對這些核心組件定義了如下這幾個(gè)對應(yīng)的接口。IWebLister接口用來監(jiān)聽、接收和響應(yīng)請求(針對請求的響應(yīng)由ReceiveAsync方法返回的HttpContext對象來完成,后者表示針對當(dāng)前請求的上下文),IControllerActivator接口用于根據(jù)當(dāng)前請求激活目標(biāo)Controller對象,已經(jīng)在后者執(zhí)行完成后做一些釋放回收工作。至于IControllerExecutorIViewRender接口則分別用來完成針對Controller的執(zhí)行和針對View的呈現(xiàn)。

我們在作為MVC引擎的MvcEngine類中定義了四個(gè)工廠方法(GetWebListener、GetControllerActivator、GetControllerExecutor和GetViewRenderer)來提供上述這4種組件。這四個(gè)工廠方法均為具有默認(rèn)實(shí)現(xiàn)的虛方法,我們可以利用它們提供默認(rèn)的組件。在用于啟動(dòng)引擎的StartAsync方法中,我們利用這些工廠方法提供的對象來具體完成請求處理流程的各個(gè)核心環(huán)節(jié)。

對于具體的應(yīng)用程序來說,如果需要對請求處理的某個(gè)環(huán)節(jié)進(jìn)行定制,它需要將定制的操作實(shí)現(xiàn)在對應(yīng)接口的實(shí)現(xiàn)類中。在MvcEngine的派生類中,我們需要重寫對應(yīng)的工廠方法來提供被定制的對象。 比如上面提及的以單例模式提供目標(biāo)Controller對象的實(shí)現(xiàn)就定義在SingletonControllerActivator類中,我們在派生于MvcEngine的FoobarMvcEngine類中重寫了工廠方法GetControllerActivator使其返回一個(gè)SingletonControllerActivator對象。

03抽象工廠

雖然工廠方法和抽象工廠均提供了一個(gè)“生產(chǎn)”對象實(shí)例的工廠,但是兩者在設(shè)計(jì)上卻有本質(zhì)的不同。工廠方法利用定義在某個(gè)類型的抽象方法或者虛方法實(shí)現(xiàn)了針對單一對象提供方式的抽象,而抽象工廠則利用一個(gè)獨(dú)立的接口或者抽象類來提供一組相關(guān)的對象。

具體來說,我們需要定義一個(gè)獨(dú)立的工廠接口或者抽象工廠類,并在其中定義多個(gè)的工廠方法來提供“同一系列”的多個(gè)相關(guān)對象。如果希望抽象工廠具有一組默認(rèn)的“產(chǎn)出”,我們也可以將一個(gè)未被封閉的具體類作為抽象工廠,以虛方法形式定義的工廠方法將默認(rèn)的對象作為返回值。我們根據(jù)實(shí)際的需要通過實(shí)現(xiàn)工廠接口或者繼承抽象工廠類(不一定是抽象類)定義具體工廠類來提供一組定制的系列對象。

現(xiàn)在我們采用抽象工廠模式來改造我們的MVC框架。如下面的代碼片段所示,我們定義了一個(gè)名為IMvcEngineFactory的接口作為抽象工廠,定義在其中定義了四個(gè)方法來提供請求監(jiān)聽和處理過程使用到的4種核心對象。如果MVC提供了針對這四種核心組件的默認(rèn)實(shí)現(xiàn),我們可以按照如下的方式為這個(gè)抽象工廠提供一個(gè)默認(rèn)實(shí)現(xiàn)(MvcEngineFactory)。

現(xiàn)在我們采用抽象工廠模式來改造我們的MVC框架。我們在創(chuàng)建MvcEngine對象可以提供一個(gè)具體的IMvcEngineFactory對象,如果沒有顯式指定,MvcEngine會使用默認(rèn)的EngineFactory對象。在用于啟動(dòng)引擎的StartAsync方法中,MvcEngine利用IMvcEngineFactory來獲取相應(yīng)的對象協(xié)作完整對請求的處理流程。

如果具體的應(yīng)用程序需要采用上面定義的SingletonControllerActivator以單例的模式來激活目標(biāo)Controller,我們可以按照如下的方式定義一個(gè)具體的工廠類FoobarEngineFactory。最終的應(yīng)用程序?qū)⑦@么一個(gè)FoobarEngineFactory對象作為MvcEngine的EngineFactory。

除了上面介紹這三種典型的設(shè)計(jì),還有很多其他的設(shè)計(jì)模式,比如策略模式、觀察者模式等等,它們無一不是采用IoC的設(shè)計(jì)原則。Martin Fowler在《Inversion of Control 》一文中正是通過觀察者模式來介紹IoC的。我們將在下一篇中對依賴注入模式進(jìn)行深入講解。

[轉(zhuǎn)載]依賴注入[2]: 基于IoC的設(shè)計(jì)模式的評論 (共 條)

分享到微博請遵守國家法律
马关县| 乡宁县| 革吉县| 湖口县| 扎囊县| 彭州市| 汉川市| 子洲县| 三台县| 蕉岭县| 永善县| 通山县| 富顺县| 鸡西市| 连城县| 临邑县| 会昌县| 上饶市| 菏泽市| 霞浦县| 丹巴县| 安达市| 呼伦贝尔市| 红安县| 横峰县| 海盐县| 扎赉特旗| 阳城县| 布尔津县| 新丰县| 丰顺县| 雅江县| 临汾市| 治多县| 齐齐哈尔市| 正定县| 巫溪县| 家居| 宣汉县| 出国| 金堂县|