咨詢(xún)電話(huà):023-6276-4481
熱門(mén)文章
電 話(huà):023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶(hù)交互的同時(shí),不需要重新編寫(xiě)業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶(hù)界面的結(jié)構(gòu)中。
小編點(diǎn)睛:MVC就是類(lèi)似三層的一種架構(gòu),主要還是采用封裝(分層)的思想,來(lái)降低耦合度,從而使我們的系統(tǒng)更加的靈活,擴(kuò)展性更好。
Model(模型)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。
View(視圖)是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
Controller(控制器)是應(yīng)用程序中處理用戶(hù)交互的部分。通??刂破髫?fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶(hù)輸入,并向模型發(fā)送數(shù)據(jù)
小編點(diǎn)睛:
(1)首先,最重要的一點(diǎn)是多個(gè)視圖能共享一個(gè)模型。同一個(gè)模型可以被不同的視圖重用,大大提高了代碼的可重用性。
(2)由于MVC的三個(gè)模塊相互獨(dú)立,改變其中一個(gè)不會(huì)影響其他兩個(gè),所以依據(jù)這種設(shè)計(jì)思想能構(gòu)造良好的松耦合的構(gòu)件。
(3)此外,控制器提高了應(yīng)用程序的靈活性和可配置性。控制器可以用來(lái)聯(lián)接不同的模型和視圖去完成用戶(hù)的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強(qiáng)有力的手段。
(1)增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。
對(duì)于簡(jiǎn)單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過(guò)多的更新操作,降低運(yùn)行效率。
?。?)視圖與控制器間的過(guò)于緊密的連接。
視圖與控制器是相互分離,但確實(shí)聯(lián)系緊密的部件,視圖沒(méi)有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。
?。?)視圖對(duì)模型數(shù)據(jù)的低效率訪問(wèn)。
依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能。
?。?) 目前,一般高級(jí)的界面工具或構(gòu)造器不支持MVC架構(gòu)。
改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價(jià)是很高的,從而造成使用MVC的困難
小編點(diǎn)睛:根據(jù)MVC的優(yōu)缺點(diǎn),我們知道,每個(gè)東西都有自己適用的范圍。
對(duì)于開(kāi)發(fā)存在大量用戶(hù)界面,并且業(yè)務(wù)邏輯復(fù)雜的大型應(yīng)用程序,MVC將會(huì)使你的軟件在健壯性、代碼重用和結(jié)構(gòu)方面上一個(gè)新的臺(tái)階。盡管在最初構(gòu)建MVC框架時(shí)會(huì)花費(fèi)一定的工作量,但從長(zhǎng)遠(yuǎn)角度看,它會(huì)大大提高后期軟件開(kāi)發(fā)的效率。
所以我們?cè)诰唧w適用時(shí),要綜合考慮其適用范圍,
小編點(diǎn)睛:這張圖描述的是webform的處理方式,它通過(guò)url請(qǐng)求服務(wù)器,訪問(wèn)index_aspx類(lèi)的Page_Load()方法,然后根據(jù)其邏輯結(jié)構(gòu)返回結(jié)果
小編點(diǎn)睛:這張圖描述的是MVC的處理方式,兩者明顯不同,首先要訪問(wèn)的url地址就不一樣,它表示news對(duì)象的index方法,所以首先根據(jù)路由配置訪問(wèn)該方法,然后根據(jù)業(yè)務(wù)邏輯得出結(jié)果,最后調(diào)用index.cshtml視圖來(lái)顯示結(jié)果
小編點(diǎn)睛:上邊這張圖是MVC的處理過(guò)程:首先控制器接收用戶(hù)的請(qǐng)求,并決定應(yīng)該調(diào)用哪個(gè)模型來(lái)進(jìn)行處理。然后模型根據(jù)用戶(hù)請(qǐng)求進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理,并返回?cái)?shù)據(jù)。最后控制器調(diào)用相應(yīng)的視圖格式化模型返回的數(shù)據(jù),并通過(guò)視圖呈現(xiàn)給用戶(hù)。
(1)先在model層寫(xiě)一個(gè)Dog實(shí)體類(lèi)
[csharp] view plain copy
public class Dog
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return "ID=" + this.ID +",Name=" + this.Name ;
}
}
(2)先在controller層寫(xiě)相應(yīng)的代碼
[csharp] view plain copy
//控制器類(lèi)(繼承了Controller)
public class HomeController : Controller
{
#region 0.1初始化數(shù)據(jù)集合 void IntData()
/// <summary>
/// 初始化數(shù)據(jù)集合
/// </summary>
public List<Models.Dog> IntData()
{
List<Models.Dog> list =new List<Models.Dog >() {
new Dog(){ ID=1,Name ="小樣~~" },
new Dog(){ ID=2,Name ="小樣2~~" },
new Dog(){ ID=3,Name ="小樣3~~" },
new Dog(){ ID=4,Name ="小樣4~~" },
};
return list;
}
#endregion
// GET: /Home/
/// <summary>
/// Action方法(可堪稱(chēng)MVC設(shè)計(jì)模式的Model
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
//2.1處理當(dāng)前業(yè)務(wù)(比如讀取數(shù)據(jù)庫(kù)。判斷等)
//2.1.1創(chuàng)建一個(gè)數(shù)據(jù)集合(偽數(shù)據(jù),并獲得數(shù)據(jù)
List<Models.Dog> list = IntData();
//2.1.2遍歷集合,生成HTNL代碼,存入builder
list.ForEach (d => {
sbHtml.Append("<div>" + d.ToString() + "</div>");
});
//2.2使用viewBag傳輸數(shù)據(jù)給同名Index.cshtml 視圖
//viewBag是一個(gè)dynamic類(lèi)型集合,可以動(dòng)態(tài)添加任意類(lèi)型的任意名稱(chēng)的屬性和值
ViewBag.HtmlStr = sbHtml.ToString();
return View();
}
}
(3)最后在view層顯示數(shù)據(jù)
[csharp] view plain copy
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content ="width=device-width" />
<title>Index</title>
</head>
<body>
<!-- 相當(dāng)于把Action中的內(nèi)容,存放在此處 輸出!-->
@Html.Raw(ViewBag.HtmlStr)
</body>
</html>
(4)運(yùn)行效果圖
1、框架通常是代碼重用,而設(shè)計(jì)模式是設(shè)計(jì)重用,架構(gòu)則介于兩者之間,部分代碼重用,部分設(shè)計(jì)重用,有時(shí)分析也可重用。
在軟件生產(chǎn)中有三種級(jí)別的重用:內(nèi)部重用,即在同一應(yīng)用中能公共使用的抽象塊;代碼重用,即將通用模塊組合成庫(kù)或工具集,以便在多個(gè)應(yīng)用和領(lǐng)域都能使用;應(yīng)用框架的重用,即為專(zhuān)用領(lǐng)域提供通用的或現(xiàn)成的基礎(chǔ)結(jié)構(gòu),以獲得最高級(jí)別的重用性。
2、設(shè)計(jì)模式是對(duì)在某種環(huán)境中反復(fù)出現(xiàn)的問(wèn)題以及解決該問(wèn)題的方案的描述,它比框架更抽象。框架可以用代碼表示,也能直接執(zhí)行或復(fù)用,而對(duì)模式而言只有實(shí)例才能用代碼表示。
設(shè)計(jì)模式是比框架更小的元素。一個(gè)框架中往往含有一個(gè)或多個(gè)設(shè)計(jì)模式,框架總是針對(duì)某一特定應(yīng)用領(lǐng)域,但同一模式卻可適用于各種應(yīng)用。
可以說(shuō),框架是軟件,而設(shè)計(jì)模式是軟件的知識(shí)。
3、簡(jiǎn)而言之:框架是大智慧,用來(lái)對(duì)軟件設(shè)計(jì)進(jìn)行分工;設(shè)計(jì)模式是小技巧,對(duì)具體問(wèn)題提出解決方案,以提高代碼復(fù)用率,降低耦合度。
小編總結(jié):通過(guò)MVC的學(xué)習(xí),我們要知道它是用來(lái)分割頁(yè)面和數(shù)據(jù)庫(kù)訪問(wèn)的框架,降低了兩者的耦合度,同時(shí)通過(guò)Controller的控制,也使系統(tǒng)更加的靈活,使我們的代碼更健壯,復(fù)用性更強(qiáng),但是凡事都有他適用的范圍,我們不能覺(jué)得它好,就不敢三七二十一的瞎用,有時(shí)可能會(huì)適得其反,因此MVC的學(xué)習(xí)還需要我們以后慢慢探討。