自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MVC架構(gòu)模式為什么這樣“紅”?

開發(fā) 開發(fā)工具
模型-視圖-控制器(MVC)可能是近年來網(wǎng)絡(luò)編程圈子里最常被提及的模式之一,目前與網(wǎng)絡(luò)應(yīng)用開發(fā)沾邊的人聽到和看到這個(gè)字母縮寫的次數(shù)肯定不下百次。本文我們將詳細(xì)闡述一下MVC的含義,以及它變的如此流行的原因。

模型-視圖-控制器(MVC)可能是近年來網(wǎng)絡(luò)編程圈子里最常被提及的模式之一,其在Java及.Net領(lǐng)域都有廣泛的應(yīng)用,特別是微軟***推出的ASP.NET MVC 2框架,能夠幫助廣大程序員更快捷的開發(fā)。51CTO編輯推薦ASP.NET MVC框架視頻教程

MVC不是一種設(shè)計(jì)模式(design pattern),它是一種架構(gòu)模式(Architectural pattern),用以描述應(yīng)用程序的結(jié)構(gòu)以及結(jié)構(gòu)中各部分的職責(zé)和交互方式。它***是在1979年的時(shí)候***次被人提出,不過,當(dāng)時(shí)環(huán)境有些不同,網(wǎng)絡(luò)應(yīng)用的概念在當(dāng)時(shí)還不存在。

提姆·伯納斯李在上世紀(jì)九十年代初期的時(shí)候播種下了萬維網(wǎng)(WWW)的種子,并永遠(yuǎn)的改變了世界。目前我們在網(wǎng)絡(luò)開發(fā)中所采用的這種模式實(shí)際上是原版模式的一個(gè)改編版。

這種架構(gòu)模式的瘋狂流行是由于兩個(gè)極其流行的開發(fā)框架將這種模式包含了進(jìn)來,它們是:Struts 和 Ruby on Rails。這兩個(gè)開發(fā)框架給稍后誕生的數(shù)百框架打上了深深的烙印。

[[9852]]

網(wǎng)絡(luò)應(yīng)用中的MVC模式

模型-視圖-控制器架構(gòu)模式背后的思想非常簡單:我們的應(yīng)用程序中必須區(qū)分下面這些職責(zé):

模型-視圖-控制器架構(gòu)模式

應(yīng)用程序被分成了三個(gè)主要的部分,每個(gè)部分負(fù)責(zé)掌管不同的任務(wù)。下面讓我們看看詳細(xì)的解釋以及一個(gè)例子。

控制器

控制器掌管著用戶的請求(當(dāng)用戶點(diǎn)擊圖形用戶界面(GUI)上的元素執(zhí)行操作時(shí),控制器會收到HTTP GET或者POST請求)。它的主要功能就是調(diào)用并協(xié)調(diào)需要的資源/對象來執(zhí)行用戶請求。通??刂破鲿槿蝿?wù)調(diào)用合適的模型,以及選擇合適的視圖。

模型

模型是指運(yùn)用于數(shù)據(jù)之上的數(shù)據(jù)規(guī)則和數(shù)據(jù)內(nèi)容,它一般對應(yīng)于應(yīng)用程序所要管理的對象。在軟件系統(tǒng)中,任何事物都可以被抽象成可以對其以某種方式進(jìn)行處理的數(shù)據(jù)模型。應(yīng)用程序中的用戶,信息以及圖書是什么?它們只是一堆必須按照對應(yīng)規(guī)則處理的數(shù)據(jù)(日期不能是未來的日期,電子郵件有特定的格式,名字的長度不能超過多少字符等等)。

模型

模型給控制器提供了一個(gè)用戶請求內(nèi)容對應(yīng)的數(shù)據(jù)表達(dá)(比如信息,書,相冊)。不管我們?nèi)绾蜗蛴脩粽故?,這個(gè)數(shù)據(jù)模型都不會變。這也是我們?yōu)槭裁纯梢噪S意選擇使用哪個(gè)視圖來展示數(shù)據(jù)的原因。模型包含我們應(yīng)用程序邏輯中最重要的組成部分,這些邏輯運(yùn)用于我們要處理的問題過程中??刂破鞲嗟氖前瑧?yīng)用程序自身的內(nèi)部組織邏輯。

視圖

視圖提供了展示模型數(shù)據(jù)的不同方式。它可能是數(shù)據(jù)填充的模板。視圖可以有多個(gè),而控制器則決定使用哪個(gè)視圖。一個(gè)網(wǎng)絡(luò)應(yīng)用通常由許多控制器,模型和視圖組成。控制器可以被看成是一個(gè)主控制器,用于接收用戶的所有請求,然后在調(diào)用特定的控制器來處理不同的情況。

讓我們看一個(gè)例子

現(xiàn)在,假設(shè),我們正在開發(fā)一個(gè)在線書店。用戶可以進(jìn)行如下操作:查看圖書。注冊,購買,往當(dāng)前訂單添加物品,創(chuàng)建和刪除圖書(如果他有管理員權(quán)限的話)?,F(xiàn)在讓我們看看當(dāng)用戶單擊“幻想”門類來查看該門類下有哪些書時(shí)會發(fā)生什么情況。

我們會有一個(gè)特定的控制器來處理所有與圖書相關(guān)的操作(查看,編輯,創(chuàng)建等操作)。這個(gè)例子中,我把該控制器命名為 books_controller.php。我們也會有一個(gè)模型(比如 book_model.php)來處理數(shù)據(jù)和與商店中圖書物品相關(guān)的邏輯。***我們還有一些視圖來展示數(shù)據(jù),比如圖書清單,一個(gè)編輯圖書的頁面等等。下面這幅圖展示的是用戶發(fā)出的查看請求是如何處理的:

實(shí)例

控制器(books_controller.php)以HTTP GET或者POST的方式接收到用戶的請求(我們也可以有一個(gè)主控制器,比如index.php 來接收請求,然后它再調(diào)用ooks_controller.php)。

控制器檢查請求以及對應(yīng)的參數(shù),然后調(diào)用模型(book_model.php),請求模型返回幻想類的圖書。模型負(fù)責(zé)從數(shù)據(jù)庫中調(diào)取信息,如有需要它可以加入過濾和邏輯,然后返回圖書列表??刂破魇褂们‘?dāng)?shù)囊晥D來將這些數(shù)據(jù)展示給用戶,如果用戶還選擇了特定皮膚,對應(yīng)的視圖文件也會被選上等等。#p#

MVC的好處是什么

我們使用MVC的一個(gè)最明顯好處就是它將視圖展示和應(yīng)用邏輯清晰的分離開來。對不同用戶以及不同設(shè)備類型的支持一直是當(dāng)下的一個(gè)常見問題。來自臺式電腦和手機(jī)的請求所得到的視圖應(yīng)該是不相同的。模型會返回完全相同的數(shù)據(jù),但是不同的地方是控制器會選擇使用的視圖文件來展示數(shù)據(jù)(我們可以把它看作是不同的模板)。除了將視圖從業(yè)務(wù)邏輯中分離開外,MVC的分離也降低了大型應(yīng)用設(shè)計(jì)的難度。代碼也更具結(jié)構(gòu)性,因此也更容易維護(hù),測試和重用。

但是為什么要框架呢?

當(dāng)你使用一個(gè)框架時(shí),MVC的基本結(jié)構(gòu)已經(jīng)包含在其中,你只需對這些結(jié)構(gòu)進(jìn)行擴(kuò)充,將你的文件遵照MVC的模式放置到合適的目錄中去。而且它也提供許多現(xiàn)成并且經(jīng)過完全測試的功能。以CakePHP最為MVC框架的例子。你一旦安裝好以后,你會發(fā)現(xiàn)它包含三個(gè)主要的目錄:

  1. * app/  
  2. * cake/  
  3. * vendors/ 

APP文件夾是放置你應(yīng)用程序文件的地方。這是你開放應(yīng)用程序的地方。Cake文件夾是Cakephp的文件存放位置以及開發(fā)的地方(框架的重要功能就在里面)Vendors文件夾是用來存放所需要的第三方PHP庫文件的位置。你的工作文件夾(APP文件夾)又有下面這些結(jié)構(gòu):

  1. * app/  
  2. config/  
  3. controllers/  
  4. locale/  
  5. models/  
  6. plugins/  
  7. tests/  
  8. tmp/  
  9. vendors/  
  10. o views/  
  11. o webroot/ 

現(xiàn)在你需要將你的控制器放置到controllers目錄下,你的模型放置的models目錄下,而視圖文件則在views目錄下。一旦你熟悉了框架,你就能在你需要修改和創(chuàng)建代碼時(shí),知道應(yīng)該在哪里動(dòng)手。這種文件組織方式讓維護(hù)容易上不少。

以框架為例

因?yàn)檫@個(gè)教程并不打算教你如何使用CakePHP制作一個(gè)應(yīng)用程序,我們只是用它來展示一下模型,視圖和控制器的演示代碼,并對使用MVC框架所帶的好處做一個(gè)評論。這些代碼都是簡化了的,并不適合實(shí)際的應(yīng)用。

控制器

使用CakePHP框架,我們的控制器的樣子像下面這樣:

  1. <?php    
  2. class BooksController extends AppController {    
  3.        
  4. function list($category) {    
  5.      
  6. $this->set('books', $this->Book->findAllByCategory($category));    
  7.      
  8. }    
  9.     
  10. function add() { ... ... }    
  11.       
  12. function delete() { ... ... }    
  13.     
  14. ... ... } ?>  

很簡單,是吧。這個(gè)控制器會被保存成 books_controller.php,并放置在/app/controllers目錄下。它包含一個(gè)列表(list)函數(shù),用以執(zhí)行我們例子中的操作,它也可以包含其他與圖書相關(guān)的操作(像添加新圖書,刪除新圖書)

框架為我們提供了許多內(nèi)容,羅列所有圖書只需一行代碼。我們在基本的控制器行為中定義的有一個(gè)基礎(chǔ)類,我們已經(jīng)繼承了。(AppController繼承自Controller的)在list操作中,我們需要做的就是調(diào)用模型獲取數(shù)據(jù),然后選擇合適的視圖文件來將數(shù)據(jù)展示給用戶,下面要我們解釋一下過程。this->Book是我們的模型,而下面這段代碼:

  1. $this->Book->findAllByCategory($category) 

則是在告訴模型返回所選門類下的圖書列表,下面的Set方法:

  1. $this->set('books', $this->Book->findAllByCategory($category)); 

是告訴控制器將數(shù)據(jù)傳輸給視圖。它將模型返回的數(shù)據(jù)以books的變量傳輸給視圖,然后視圖中就可以訪問該變量了?,F(xiàn)在我們需要渲染視圖,如果你是使用默認(rèn)視圖,CakePHP會幫你自動(dòng)完成。如果你需要使用其他視圖,你則需要使用render方法來具體聲明:

模型

模型非常簡單。

  1. <?php    
  2.      
  3. class Book extends AppModel {     
  4.       
  5. }    
  6.      
  7. ?>  

為什么是空的?因?yàn)樗鼜幕A(chǔ)類繼承了一些必須的功能,我們只需遵循CakePHP的命名規(guī)范,然后框架就會自動(dòng)幫你完成其他事情。比如。通過名字,CakePHP知道,這個(gè)是BooksController中使用的模型。然后會自動(dòng)訪問數(shù)據(jù)庫中一個(gè)叫books的數(shù)據(jù)表。這個(gè)定義,我們的book模型就具備從數(shù)據(jù)庫中讀取,刪除和保存數(shù)據(jù)的能力。這段代碼應(yīng)該保存成books.php,并放置于/app/models文件下。

視圖

我們現(xiàn)在需要做的事情就是為list操作創(chuàng)建一個(gè)視圖(至少是一個(gè))。這個(gè)視圖將使用HTML代碼,并且還包含一些PHP代碼來遍歷模型提供的 books數(shù)組。

  1. <table> <tr> <th>Title</th> <th>Author</th> <th>Price</th> </tr>    
  2. <?php foreach ($books as $book): ?> <tr> <td> <?php echo $book['Book']['title'];   
  3. ?> </td> <td> <?php echo $book['Book']['author'];   
  4. ?> </td> <td> <?php echo $book['Book']['price'];   
  5. ?> </td> </tr> <?php endforeach; ?>    
  6. </table>  

我們已經(jīng)看到了,視圖文件并不生成一個(gè)完成的頁面,它只是一段HTML代碼。這是因?yàn)镃akePHP提供了定義頁面布局的方法,而視圖則會被插入到布局中。在創(chuàng)建這些HTML片段時(shí),框架也提供一些助手(helper)對象來幫我們完成常見的任務(wù)(插入表單,鏈接,Ajax或者 JavaScript),我們將這個(gè)默認(rèn)視圖保存為list.ctp(list是操作的名稱,而ctp是指cake模板),然后將它放置在 /app/views/books下(之所以在books目錄下,是因?yàn)樗荁ook控制器的操作),至此在CakePHP的幫助下,這三部分都完成了。

結(jié)論

我們已經(jīng)學(xué)習(xí)了當(dāng)今最常用的架構(gòu)模式MVC,我們需要注意,當(dāng)我們在編程界提及的模式時(shí),我們指的是可以用來解決手中問題的靈活架構(gòu)。我們會發(fā)現(xiàn)實(shí)際使用會給我們看到的結(jié)構(gòu)帶來變動(dòng)。但最為重要的是,這種模式會幫助我們氣息的區(qū)分程序各部分的職責(zé),便于程序維護(hù),代碼重用以及測試。我們已經(jīng)見識了使用MVC框架的好處,它給我們提供了一個(gè)基本的MVC骨架,以及許多有用的功能,提高了我們的效率,讓開發(fā)過程更加輕松。

【編輯推薦】

  1. 詳解ASP.NET MVC入門級實(shí)例教程
  2. 詳解PHP實(shí)現(xiàn)MVC的幾種方法
  3. 有關(guān)ASP.NET MVC框架的一些基礎(chǔ)知識
  4. MVC模式學(xué)習(xí)心得:主動(dòng)與被動(dòng)模式
  5. 專訪微軟MVP衣明志:走進(jìn)ASP.NET MVC 2框架開發(fā)
責(zé)任編輯:王曉東 來源: 中文業(yè)界資訊站
相關(guān)推薦

2023-06-16 13:34:00

軟件架構(gòu)模式

2024-11-08 09:41:02

2012-01-13 10:45:56

企業(yè)應(yīng)用架構(gòu)

2024-02-05 08:11:30

架構(gòu)模式單體

2020-12-29 19:15:04

架構(gòu)模式代碼分布式

2022-06-14 11:01:37

架構(gòu)模式開發(fā)

2023-07-27 06:51:46

Android架構(gòu)模式

2021-07-02 06:54:45

軟件架構(gòu)模式

2022-04-02 23:32:42

數(shù)據(jù)網(wǎng)格架構(gòu)

2023-07-04 07:53:53

MVCDDD架構(gòu)

2020-02-24 21:23:41

跨平臺想法嘗試

2018-05-24 11:38:17

2017-06-19 13:10:59

大數(shù)據(jù)大數(shù)據(jù)平臺架構(gòu)

2017-06-20 09:54:18

大數(shù)據(jù)架構(gòu)數(shù)據(jù)分析

2024-09-18 09:04:33

架構(gòu)模式查詢

2012-10-08 11:18:38

企業(yè)應(yīng)用架構(gòu)工作單元模式

2023-09-11 11:18:44

軟件開發(fā)架構(gòu)

2012-10-08 11:16:36

企業(yè)應(yīng)用架構(gòu)標(biāo)識映射

2011-12-23 10:01:29

2020-06-22 07:00:00

軟件架構(gòu)架構(gòu)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號