PureMVC--一款多平臺(tái)MVC框架

引子

了解設(shè)計(jì)模式的人應(yīng)該都多少聽(tīng)說(shuō)過(guò)MVC模式。
嚴(yán)格意義上來(lái)說(shuō)悯辙,“MVC模式”是一個(gè)偽概念才避,因?yàn)镸VC并不屬于設(shè)計(jì)模式,至少不屬于GoF的23種設(shè)計(jì)模式之一哺壶,而更像是一個(gè)設(shè)計(jì)模式的結(jié)合體:V和C之間會(huì)實(shí)現(xiàn)觀察者模式屋吨,M內(nèi)部會(huì)實(shí)現(xiàn)單例模式,C在派發(fā)任務(wù)時(shí)會(huì)實(shí)現(xiàn)Command模式山宾。
不得不說(shuō)至扰,MVC模式對(duì)軟件的高可擴(kuò)展性和高可維護(hù)性做出了巨大的貢獻(xiàn),這也使得MVC模式成為很多中等規(guī)模甚至大規(guī)模軟件的常用框架资锰,且經(jīng)歷了20余年仍舊在軟件開(kāi)發(fā)領(lǐng)域流行并通用敢课,足可見(jiàn)MVC模式的經(jīng)典。
但是傳統(tǒng)MVC模式真的那么完美嗎绷杜?

傳統(tǒng)MVC的痛點(diǎn)

讓我們一個(gè)個(gè)來(lái)說(shuō)直秆。
Controller:控制器,包含了項(xiàng)目的業(yè)務(wù)邏輯鞭盟。但是也是被大家吐槽最多的一個(gè)圾结,原因就是很多人,或者說(shuō)大多數(shù)人懊缺,習(xí)慣于什么都往Controller里寫(xiě)疫稿,最后一個(gè)Controller超過(guò)1000行代碼是司空見(jiàn)慣的事。所以關(guān)于傳統(tǒng)MVC的第一個(gè)痛點(diǎn)就是鹃两,Controller過(guò)于臃腫遗座。

Model:模型,包含了項(xiàng)目的數(shù)據(jù)模型俊扳。MVC定義之初途蒋,Model是核心,旨在使得同一個(gè)Model可以被復(fù)用到多個(gè)項(xiàng)目或者被復(fù)用到同一個(gè)項(xiàng)目的不同模塊之中馋记。但是在實(shí)際項(xiàng)目中号坡,Model還承載著純Model層內(nèi)部的運(yùn)算的工作懊烤,但是運(yùn)算部分會(huì)項(xiàng)目的不同而有所區(qū)別,因此與項(xiàng)目的適配反而成為了Model可復(fù)用的枷鎖宽堆。所以關(guān)于傳統(tǒng)MVC的第二個(gè)痛點(diǎn)就是腌紧,Model變得不可復(fù)用。

View:視圖畜隶,包含了項(xiàng)目所有的UI組件壁肋。視圖本身沒(méi)有什么好被大家詬病的,但是由于MVC中對(duì)于View和Controller界限的模糊界定造成了使用者在寫(xiě)代碼的時(shí)候會(huì)覺(jué)得這部分代碼放在View或者Controller里都可以的情況籽慢。例如事件的處理浸遗,組件的組合等。所以關(guān)于傳統(tǒng)MVC的第三個(gè)痛點(diǎn)就是箱亿,View概念的模糊跛锌。

PureMVC

既然上文說(shuō)的是傳統(tǒng)MVC,那么可以判定PureMVC是一個(gè)新型MVC届惋。

其實(shí)PureMVC只是相對(duì)于傳統(tǒng)MVC(20年陳釀)來(lái)說(shuō)“新”一些而已髓帽,因?yàn)镻ureMVC今年也已經(jīng)有10年的歷史了。

PureMVC是一款基于MVC的開(kāi)源框架盼樟,最初是為基于ActionScript3的Flash,RIA程序開(kāi)發(fā)的氢卡,后來(lái)被移植到16種語(yǔ)言平臺(tái)上

PureMVC分為標(biāo)準(zhǔn)版本和多核版本晨缴,后者為程序的模塊化開(kāi)發(fā)提供了支持译秦。本文以標(biāo)準(zhǔn)版為例分析PureMVC。

PureMVC的MVC

image

在PureMVC實(shí)現(xiàn)的MVC模式中击碗,MVC分別由三個(gè)單例模式來(lái)管理筑悴,三者成為PureMVC的核心層。

Model與Proxy

Proxy(模式)稍途,提供了一個(gè)一個(gè)包裝器或一個(gè)中介被客戶(hù)端調(diào)用阁吝,從而達(dá)到去訪問(wèn)在場(chǎng)景背后的真實(shí)對(duì)象。Proxy模式可以方便的將操作轉(zhuǎn)給真實(shí)對(duì)象械拍,或者提供額外的邏輯突勇。

在PureMVC中,Model保存了對(duì)Proxy對(duì)象的引用坷虑,Proxy去操作具體的數(shù)據(jù)模型(Data Object)甲馋。也就是說(shuō),Proxy管理Data Object以及對(duì)Data Object的訪問(wèn)迄损。

View與Mediator

Mediator(模式)定躏,定義了一種封裝對(duì)象之間交互的中介。這種設(shè)計(jì)模式被認(rèn)為是行為模式因?yàn)樗梢愿淖兡J降倪\(yùn)行行為。

正如定義里所說(shuō)痊远,PureMVC中垮抗,View只關(guān)心UI,具體的對(duì)對(duì)象的操作由Mediator來(lái)管理碧聪,包括添加事件監(jiān)聽(tīng)冒版,發(fā)送或接受Notification,改變組件狀態(tài)等矾削。這也解決了視圖與視圖控制邏輯的分離壤玫。

Controller與Command

Command(模式),是一種行為設(shè)計(jì)模式哼凯,這種模式下所有動(dòng)作或者行為所需信息被封裝到一個(gè)對(duì)象之內(nèi)。Command模式解耦了發(fā)送者與接收者之間的聯(lián)系楚里。
在PureMVC中断部,Controller保存了所有Command的映射。Command是無(wú)狀態(tài)且惰性的班缎,只有在需要的時(shí)候才被創(chuàng)建蝴光。

Facade

與傳統(tǒng)MVC模式不用的是,PureMVC中對(duì)于Model达址,View蔑祟,Controller的調(diào)用是基于Facade模式的。
Facade模式沉唠,對(duì)應(yīng)了GoF中的Facade模式疆虚,是一種將復(fù)雜且龐大的內(nèi)部實(shí)現(xiàn)暴露為一個(gè)簡(jiǎn)單接口的設(shè)計(jì)模式,例如對(duì)大型類(lèi)庫(kù)的封裝满葛。

在PureMVC中径簿,F(xiàn)acade是與核心層(Model,View,Controller)進(jìn)行通信的唯一接口,目的是簡(jiǎn)化開(kāi)發(fā)復(fù)雜度嘀韧。實(shí)際編碼過(guò)程中篇亭,不需要手動(dòng)實(shí)現(xiàn)這三類(lèi)文件,F(xiàn)acade類(lèi)在構(gòu)造方法中已經(jīng)包含了對(duì)這三類(lèi)單例的構(gòu)造锄贷。

PureMVC各層之間的交互

View層的Mediator可以和Model層的Proxy進(jìn)行互相訪問(wèn)译蒂,但是PureMVC設(shè)計(jì)之初是希望只有View依賴(lài)于Model,反之不成立谊却。也就是View可以知道Model層有什么柔昼,但是Model層不需要知道View的任何內(nèi)容。Mediator訪問(wèn)數(shù)據(jù)可以直接通過(guò)Proxy來(lái)完成因惭,但是如果要對(duì)Proxy具體的內(nèi)容進(jìn)行加工岳锁,必須要通過(guò)Controller的Command來(lái)完成,這有助于實(shí)現(xiàn)View和Model之間的松散耦合蹦魔。

如上文所說(shuō)激率,Proxy最好不要直接調(diào)用Mediator來(lái)通知它請(qǐng)求完成咳燕,而是在異步取到數(shù)據(jù)之后,通過(guò)Notification來(lái)進(jìn)行通知乒躺。Proxy只發(fā)送通知招盲,不應(yīng)該監(jiān)聽(tīng)通知,因?yàn)镻roxy屬于Model層嘉冒,不應(yīng)該知道View層的狀態(tài)變化曹货。當(dāng)然,Proxy應(yīng)當(dāng)對(duì)外提供數(shù)據(jù)變更的接口讳推。

Command的實(shí)例化與執(zhí)行只能由Controller來(lái)做顶籽。作為控制邏輯的執(zhí)行體,Command有權(quán)拿到Proxy和Mediator的對(duì)象银觅,并進(jìn)行值加工礼饱,最后會(huì)將結(jié)果通過(guò)Notification發(fā)送給其它Command或者M(jìn)ediator。

業(yè)務(wù)邏輯 VS 域邏輯

你可能會(huì)遇到這個(gè)問(wèn)題:某段邏輯到底是應(yīng)當(dāng)放在Proxy(Model)里究驴,還是應(yīng)該放在Command(Controller)里镊绪?
其實(shí)這個(gè)問(wèn)題可以引申為業(yè)務(wù)邏輯與域邏輯的區(qū)別。

  • 業(yè)務(wù)邏輯
    指的是那些需要協(xié)調(diào)Model與View的邏輯洒忧。
  • 域邏輯
    指的是僅僅是針對(duì)數(shù)據(jù)模型的操作蝴韭,不論是對(duì)于客戶(hù)端還是對(duì)于服務(wù)端,不論是同步的操作還是異步的操作熙侍。

因此榄鉴,業(yè)務(wù)邏輯理所當(dāng)然應(yīng)該放在Command里來(lái)完成,而域邏輯應(yīng)當(dāng)放在Proxy里完成核行。

案例分析

...

總結(jié)

回到文章的開(kāi)頭牢硅,PureMVC到底如何解決了傳統(tǒng)MVC的三個(gè)痛點(diǎn)?

Controller將操作邏輯細(xì)化為Command

根據(jù)PureMVC的最佳實(shí)踐芝雪,Controller實(shí)體不需要單獨(dú)實(shí)現(xiàn)减余,且Controller內(nèi)部將每一個(gè)操作分割為一個(gè)個(gè)Command,這從根本上解決了Controller越來(lái)越臃腫的問(wèn)題惩系,強(qiáng)制用戶(hù)將Controller里每一個(gè)操作細(xì)粒度化位岔,使得代碼可讀性更強(qiáng),維護(hù)性更高堡牡。

Proxy負(fù)責(zé)域邏輯抒抬,DataObject負(fù)責(zé)數(shù)據(jù)模型

PureMVC中,與域相關(guān)的邏輯和接口由Proxy來(lái)負(fù)責(zé)晤柄,后續(xù)的添加和修改接口只在Proxy中完成擦剑。而DataObject是完全對(duì)業(yè)務(wù)進(jìn)行數(shù)據(jù)建模而產(chǎn)生的數(shù)據(jù)模型,與業(yè)務(wù)沒(méi)有絲毫的關(guān)系,因此也保證了高可移植性惠勒。

ViewComponent只關(guān)注UI赚抡,其余的交給Mediator

PureMVC規(guī)定了ViewComponent只負(fù)責(zé)UI的繪制,而其他事情纠屋,包括事件的綁定統(tǒng)統(tǒng)交給Mediator來(lái)做涂臣。這也就避免了ViewComponent內(nèi)部代碼定義模糊,更不會(huì)和Controller的代碼進(jìn)行混淆售担。

作者:nimomeng
鏈接:http://www.reibang.com/p/47deaced9eb3
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有赁遗,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末族铆,一起剝皮案震驚了整個(gè)濱河市岩四,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骑素,老刑警劉巖炫乓,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異献丑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)侠姑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)创橄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人莽红,你說(shuō)我怎么就攤上這事妥畏。” “怎么了安吁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵醉蚁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鬼店,道長(zhǎng)网棍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任妇智,我火速辦了婚禮滥玷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巍棱。我一直安慰自己惑畴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布航徙。 她就那樣靜靜地躺著如贷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杠袱,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天尚猿,我揣著相機(jī)與錄音,去河邊找鬼霞掺。 笑死谊路,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菩彬。 我是一名探鬼主播缠劝,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骗灶!你這毒婦竟也來(lái)了惨恭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耙旦,失蹤者是張志新(化名)和其女友劉穎脱羡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體免都,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锉罐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绕娘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓规。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖险领,靈堂內(nèi)的尸體忽然破棺而出侨舆,到底是詐尸還是另有隱情,我是刑警寧澤绢陌,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布挨下,位于F島的核電站,受9級(jí)特大地震影響脐湾,放射性物質(zhì)發(fā)生泄漏臭笆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一沥割、第九天 我趴在偏房一處隱蔽的房頂上張望耗啦。 院中可真熱鬧,春花似錦机杜、人聲如沸帜讲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)似将。三九已至获黔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間在验,已是汗流浹背玷氏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腋舌,地道東北人盏触。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像块饺,于是被迫代替她去往敵國(guó)和親赞辩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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