深入淺出——MVC
MVC,MVP,MVVM,這些都是耳熟能詳的,而我之前的一篇文章其實也寫過這三個框架,並且為它們分別畫了圖解釋,相信疑惑的人看完以後對這三個框架一定有種豁然開朗的感覺。
其實本來是不打算再寫關於MVC的文章,但是後來發現,有一些更深的理解和邏輯。單純依靠圖片的解釋,或許只能達到堪堪入門的境界,想了很久還是決定,單獨開一篇MVC的文章,讓我們深入淺出一下MVC的機制和原理。
-
MVC,即Model、View、Contoller,也就是模型、檢視、控制器。
不知道大家是否有種習慣,喜歡把業務邏輯放在 Contoller中,將資料庫訪問操作放在Model中。乍看起來,好像並沒有問題,軟體也可以完好的寫出來,但是其實這種寫法並不能被稱為MVC,而是另外一種也很出名很重要的架構,DAO三層架構。
在DAO三層架構中,分為UI介面層,業務邏輯層,資料訪問層,曾經它也是紅極一時的架構,只是在MVC出來之後銷聲匿跡了,但其實現在看來,許多人還是習慣於DAO三層架構,只是套了個MVC的名字而已。而MVC最重要的程式碼可擴充套件性、可複用性、可維護性在這其中就得到了削弱。
想要深入理解MVC,其實離不開Android的兄弟Javaweb。學習過JSP的人應該都有或者曾經有過一個疑惑:JSP和Servlet到底是什麼關係,這裡只做簡單表述。
-
Servlet在Java程式碼中透過Http ServletReponse物件動態輸出HTML內容,能夠很好地組織業務邏輯程式碼。但是在Java原始檔中透過字串拼接生產動態HTML會導致程式碼的可讀性較差,維護起來比較困難
-
JSP在靜態HTML中嵌入Java程式碼,Java程式碼會被動態執行後生產HTML內容,JSP其實是避開了 Servlet在生成HTML內容的缺點,但是在HTML中混入大量複雜的業務邏輯就是他的劣勢了
而這個時候MVC框架就發揮了重要的作用,它能夠使 Servlet和JSP揚長避短,發揮各自的優勢。
在MVC模式中:
-
Contoller(控制器),負責轉發請求,對請求進行處理。web瀏覽器傳送HTTP請求到服務端,被 Contoller(也就是Servlet)獲取並處理(引數解析、請求轉發等)
-
Contoller(也就是Servlet)呼叫核心業務邏輯——model,獲取結果
-
Contoller(也及時Servlet)將邏輯處理結果交給View(也就是JSP),動態輸出HTML內容
看到這裡是不是就很清晰了,這就是MVC的作用
而Android,自然也可以使用MVC框架,MVC的設計模式表面,應用的任何物件,歸根結底都屬於模型物件、檢視物件以及控制器物件中的一種。讓我們來看看Android中的MVC
-
模型物件(Model),儲存著應用的資料和業務邏輯。模型類通常用來對映與應用相關的一些事物,例如:使用者、商店裡的商品、伺服器上的圖片。模型物件不關心使用者介面,為儲存和管理應用資料而生
-
檢視物件(View),知道如何在螢幕上繪製自己,以及如何響應使用者的輸入,例如:觸控動作,點選動作等等。凡是能在螢幕上看到的都是檢視物件
-
控制器物件(Controller),含有應用的邏輯單元,是檢視物件與模型物件的聯絡紐帶。控制器物件響應檢視物件出發的各類事件,還管理者檢視物件和模型物件的資料互動。在Android中控制器一般是由Activity、Fragment或者Service的子類擔當
眾所周知,GoF總結過23種設計模式,這23個設計模式是某小姐特定的程式設計問題的良藥。MVC也可以說是一種模式,區別於這23種模式之外的模式。當然,確切的說,MVC應該是多種設計模式的組合,所運用到的其實還是那23中之三。
組合模式:只在檢視層(View)活動,檢視層的實現用的就是組合模式。組合模式的類層次結構是樹狀的,而不論是web還是Android其實也都是樹狀結構組織介面控制物件的,只不過瀏覽器等廠商幫我們把介面相關的部分做完了,所以我們感覺不到而已,但是它確實是MVC應用中的一部分。
觀察模式:被分為兩個部分,被觀察的物件,和觀察者。其實這樣說,或許有點蒙,可以這樣理解,觀察模式其實就是監聽模式。在MVC中,Model是被觀察的物件,View是觀察者。一旦Model發生改變,View就會被通知更新。在web中因為隔了一個HTTP,所以不能顯示的進行關聯,而他們的關係就變成了View接受使用者的資料透過HTTP傳送給了伺服器,伺服器上的Model接收資料進行某些操作,在透過HTTP傳送給View,View再更新介面。
策略模式:其實是View和Controller之間的關係, Controller是View的一個策略, Controller對於View是可替換的,View對 Controller是一對多的關係,基礎會有一個View被多個 Controller引用。
MVC是個很有意思的東西,他對於程式設計時的靈活性,複用性,擴充套件性都有好處,真正寫出MVC框架的軟體程式,對於軟體工程師來說不論是現在還是未來都是很有好處的一件事情
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2694325/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入淺出Spring MVCSpringMVC
- 深入淺出FE(十四)深入淺出websocketWeb
- 淺讀-《深入淺出Nodejs》NodeJS
- 深入淺出mongooseGo
- HTTP深入淺出HTTP
- 深入淺出WebpackWeb
- 深入淺出HTTPHTTP
- mysqldump 深入淺出MySql
- 深入淺出IO
- 深入淺出decorator
- ArrayList 深入淺出
- 深入淺出 RabbitMQMQ
- 深入淺出PromisePromise
- 深入淺出 ZooKeeper
- Flutter | 深入淺出KeyFlutter
- 深入淺出 Laravel EchoLaravel
- 深入淺出理解ReduxRedux
- 深入淺出 Laravel MacroableLaravelMac
- flutter ScopedModel深入淺出Flutter
- 反射的深入淺出反射
- 《深入淺出webpack》有感Web
- 深入淺出Tomcat系列Tomcat
- [譯] 深入淺出 SVGSVG
- SSL/TLS 深入淺出TLS
- Tomcat深入淺出(一)Tomcat
- 深入淺出:HTTP/2HTTP
- 深入淺出Spark JoinSpark
- 深入淺出redux學習Redux
- 深入淺出redux-middlewareRedux
- 深入淺出HTTPS工作原理HTTP
- 深入淺出weex-builderUI
- 深入淺出grid佈局
- 深入淺出依賴注入依賴注入
- 深入淺出React和ReduxReactRedux
- 深入淺出 FlatBuffers 之 Schema
- 深入淺出 testing-library
- 深入淺出 JSON Web TokenJSONWeb
- 深入淺出 Locust 實現