咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          MVC與MVP

          Posted on 2010-02-28 15:38 oathleo 閱讀(2858) 評(píng)論(6)  編輯  收藏 所屬分類(lèi): Java
          很長(zhǎng)一段時(shí)間,對(duì)MVC和MVP區(qū)別很是模糊。
          一直忙碌于客戶不停的需求中,忽略了產(chǎn)品本身上這些最重要的東西。
          現(xiàn)在即將待業(yè),放下自己為之工作近三年的產(chǎn)品,真的感覺(jué)猶如失去自己的孩子。
          好的一方面是空閑的時(shí)間多了,終于可以想想這些事情了。

          MVC算是個(gè)被人說(shuō)爛掉的東西了,MVP也屢屢被人提及。
          最大的區(qū)別在哪里呢?為什么要再演變個(gè)MVP出來(lái)呢?

          就定義上來(lái)說(shuō)最大的區(qū)別在于C和P,就構(gòu)架上來(lái)說(shuō),是View層實(shí)現(xiàn)的方式不同。
          MVC:View層肩負(fù)很大任務(wù),View關(guān)聯(lián)Model,View的渲染是直接通過(guò)Model層的數(shù)據(jù)來(lái)確定的。還是有很多業(yè)務(wù)邏輯在View上完成。
          MVP:View層的任務(wù)大大縮減,View不再知道Model,P層完成上面提到的View層完成的業(yè)務(wù)邏輯。
          總之一句話MVP里,View層絕對(duì)不能再訪問(wèn)Model了,

          任何一種設(shè)計(jì)模式的出現(xiàn)絕對(duì)不是為了出現(xiàn)而出現(xiàn)的??偸菫榱私鉀Q現(xiàn)實(shí)中存在的某些老的模式無(wú)法或難以解決的問(wèn)題才出現(xiàn)的。

          為什么會(huì)出現(xiàn)MVP呢?
          看看客戶拿到一個(gè)設(shè)計(jì)精良的MVC的產(chǎn)品,做二次開(kāi)發(fā)的時(shí)候,如果他項(xiàng)目足夠大,肯定會(huì)發(fā)現(xiàn)MVC的好處。任務(wù)集中在Model層,設(shè)計(jì)好Model層數(shù)據(jù)的填充,簡(jiǎn)單的實(shí)現(xiàn)就完成了。MVC的架構(gòu)幫他解決了很多問(wèn)題,大家很Happy!
          當(dāng)然客戶的需求總是永無(wú)止境的,當(dāng)簡(jiǎn)單需求被滿足的時(shí)候,他又會(huì)往高層次發(fā)展,也許他就完全需要不同的View來(lái)做同樣的Model的展示(比如一個(gè)在JSP,一個(gè)在Swing或者Android上),在這個(gè)時(shí)候,稍微想下,他就發(fā)現(xiàn)他要做的任務(wù)開(kāi)始變的很大了。Model層的數(shù)據(jù)縱使可以共享,事件控制(轉(zhuǎn)發(fā))也能,而View層無(wú)論如何是逃不了了。于是Web程序員硬著頭皮也要學(xué)Swing,Swing的程序員郁悶的學(xué)JSP。
          試想這個(gè)時(shí)候如果有個(gè)人,能把陷在View上的上萬(wàn)行code,拉到一個(gè)即能聯(lián)系到Model,又能聯(lián)系到View的層次上,那真的要感謝蒼天大地了。

          MVP我想應(yīng)該就是在這個(gè)時(shí)候出現(xiàn)的。它處理所有View和Model之間的消息傳遞,數(shù)據(jù)更新,交互操作。比如從Swing的TextField里輸入個(gè)字段信息,和從JSP里的Form里輸入這個(gè)字段信息,處理的流程應(yīng)該是可以共享這段代碼的。當(dāng)然這個(gè)時(shí)候,為了解決不同View上的一些特殊情況,可以使用適配器模式,來(lái)處理多個(gè)View的程序設(shè)計(jì)問(wèn)題。

          設(shè)計(jì)模式?jīng)]有好壞之分,只有合不合適。你的產(chǎn)品如果只需要輸入個(gè)A返回個(gè)B,沒(méi)有平臺(tái)建議,沒(méi)有系統(tǒng)升級(jí),那就忘了所有的設(shè)計(jì)模式,走那條最快實(shí)現(xiàn)的路吧。

          Feedback

          # re: MVC與MVP  回復(fù)  更多評(píng)論   

          2010-03-01 09:18 by Aspen
          "完全需要不同的View來(lái)做同樣的Model的展示",這不就是MVC?

          # re: MVC與MVP  回復(fù)  更多評(píng)論   

          2010-03-01 10:37 by /admin
          不是看的很明白

          # re: MVC與MVP  回復(fù)  更多評(píng)論   

          2010-03-01 12:58 by oathleo
          @Aspen
          比如一個(gè)項(xiàng)目,先在Swing的View里寫(xiě)了一堆邏輯代碼,后面升級(jí)到BS模式,會(huì)發(fā)現(xiàn)Swing的View里的這些邏輯,其實(shí)很多BS里同樣需要用的

          # re: MVC與MVP  回復(fù)  更多評(píng)論   

          2010-03-01 22:02 by 凡客誠(chéng)品
          是大幅減少的糾紛

          # re: MVC與MVP[未登錄](méi)  回復(fù)  更多評(píng)論   

          2010-03-03 09:15 by test
          http://www.chenfangfang.com

          # re: MVC與MVP  回復(fù)  更多評(píng)論   

          2010-03-03 11:14 by oathleo
          @Aspen
          可能jsp和swing的例子舉的確實(shí)是很不恰當(dāng)。
          這樣來(lái)說(shuō):
          系統(tǒng)有兩套View
          一套AWT,一套Swing,都是Java實(shí)現(xiàn)

          這個(gè)時(shí)候MVC模式下,View上的很多邏輯代碼,就可能有很多可以共享。而這些代碼放在Model層上顯然不合適(因?yàn)檫@些代碼可能需要View的實(shí)例),這個(gè)時(shí)候P層的出現(xiàn)就可以解決這個(gè)問(wèn)題。
          主站蜘蛛池模板: 张家港市| 房山区| 合水县| 封丘县| 华阴市| 兴仁县| 固原市| 武宁县| 织金县| 门源| 灵璧县| 新宁县| 绥江县| 台中县| 新宾| 昂仁县| 玉田县| 隆化县| 宁城县| 石河子市| 常山县| 松溪县| 永和县| 定日县| 方城县| 房山区| 彭山县| 绥芬河市| 南郑县| 奉化市| 拉孜县| 辽阳市| 平南县| 包头市| 东安县| 巴中市| 离岛区| 林甸县| 惠安县| 资溪县| 宜昌市|