一、什麼是MVC
1、概念
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。
小編點睛:MVC就是類似三層的一種架構,主要還是採用封裝(分層)的思想,來降低耦合度,從而使我們的系統更加的靈活,擴展性更好。
2、內容
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。通常模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。通常視圖是依據模型數據創建的。
Controller(控制器)是應用程序中處理用戶交互的部分。通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據
小編點睛:
3、優點
(2)由於MVC的三個模塊相互獨立,改變其中一個不會影響其他兩個,所以依據這種設計思想能構造良好的鬆耦合的構件。
(3)此外,控制器提高了應用程序的靈活性和可配置性。控制器可以用來聯接不同的模型和視圖去完成用戶的需求,這樣控制器可以爲構造應用程序提供強有力的手段。
4、缺點
(1)增加了系統結構和實現的複雜性。
對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結構的複雜性,並可能產生過多的更新操作,降低運行效率。
(2)視圖與控制器間的過於緊密的連接。
視圖與控制器是相互分離,但確實聯繫緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。
(3)視圖對模型數據的低效率訪問。
依據模型操作接口的不同,視圖可能需要多次調用才能獲得足夠的顯示數據。對未變化數據的不必要的頻繁訪問,也將損害操作性能。
(4) 目前,一般高級的界面工具或構造器不支持MVC架構。
改造這些工具以適應MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難
小編點睛:根據MVC的優缺點,我們知道,每個東西都有自己適用的範圍。
對於開發存在大量用戶界面,並且業務邏輯複雜的大型應用程序,MVC將會使你的軟件在健壯性、代碼重用和結構方面上一個新的臺階。儘管在最初構建MVC框架時會花費一定的工作量,但從長遠角度看,它會大大提高後期軟件開發的效率。
所以我們在具體適用時,要綜合考慮其適用範圍,
二、工作原理
1、web工作原理圖
小編點睛:這張圖描述的是webform的處理方式,它通過url請求服務器,訪問index_aspx類的Page_Load()方法,然後根據其邏輯結構返回結果
小編點睛:這張圖描述的是MVC的處理方式,兩者明顯不同,首先要訪問的url地址就不一樣,它表示news對象的index方法,所以首先根據路由配置訪問該方法,然後根據業務邏輯得出結果,最後調用index.cshtml視圖來顯示結果
2、內部工作原理圖
小編點睛:上邊這張圖是MVC的處理過程:首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理。然後模型根據用戶請求進行相應的業務邏輯處理,並返回數據。最後控制器調用相應的視圖格式化模型返回的數據,並通過視圖呈現給用戶。
3、小例子
(1)先在model層寫一個Dog實體類
- public class Dog
- {
- public int ID { get; set; }
- public string Name { get; set; }
- public override string ToString()
- {
- return “ID=” + this.ID +“,Name=” + this.Name ;
- }
- }
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層寫相應的代碼
- //控制器類(繼承了Controller)
- public class HomeController : Controller
- {
- #region 0.1初始化數據集合 void IntData()
- /// <summary>
- /// 初始化數據集合
- /// </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方法(可堪稱MVC設計模式的Model
- /// </summary>
- /// <returns></returns>
- public ActionResult Index()
- {
- System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
- //2.1處理當前業務(比如讀取數據庫。判斷等)
- //2.1.1創建一個數據集合(僞數據,並獲得數據
- List<Models.Dog> list = IntData();
- //2.1.2遍歷集合,生成HTNL代碼,存入builder
- list.ForEach (d => {
- sbHtml.Append(”<div>” + d.ToString() + “</div>”);
- });
- //2.2使用viewBag傳輸數據給同名Index.cshtml 視圖
- //viewBag是一個dynamic類型集合,可以動態添加任意類型的任意名稱的屬性和值
- ViewBag.HtmlStr = sbHtml.ToString();
- return View();
- }
- }
//控制器類(繼承了Controller)
public class HomeController : Controller
{
#region 0.1初始化數據集合 void IntData()
/// <summary>
/// 初始化數據集合
/// </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方法(可堪稱MVC設計模式的Model
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(4000);
//2.1處理當前業務(比如讀取數據庫。判斷等)
//2.1.1創建一個數據集合(僞數據,並獲得數據
List<Models.Dog> list = IntData();
//2.1.2遍歷集合,生成HTNL代碼,存入builder
list.ForEach (d => {
sbHtml.Append("<div>" + d.ToString() + "</div>");
});
//2.2使用viewBag傳輸數據給同名Index.cshtml 視圖
//viewBag是一個dynamic類型集合,可以動態添加任意類型的任意名稱的屬性和值
ViewBag.HtmlStr = sbHtml.ToString();
return View();
}
}
(3)最後在view層顯示數據
- @{
- Layout = null;
- }
- <!DOCTYPE html>
- <html>
- <head>
- <meta name=”viewport” content =“width=device-width” />
- <title>Index</title>
- </head>
- <body>
- <!– 相當於把Action中的內容,存放在此處 輸出!–>
- @Html.Raw(ViewBag.HtmlStr)
- </body>
- </html>
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content ="width=device-width" />
<title>Index</title>
</head>
<body>
<!-- 相當於把Action中的內容,存放在此處 輸出!-->
@Html.Raw(ViewBag.HtmlStr)
</body>
</html>
(4)運行效果圖
三、框架VS設計模式
1、框架通常是代碼重用,而設計模式是設計重用,架構則介於兩者之間,部分代碼重用,部分設計重用,有時分析也可重用。
在軟件生產中有三種級別的重用:內部重用,即在同一應用中能公共使用的抽象塊;代碼重用,即將通用模塊組合成庫或工具集,以便在多個應用和領域都能使用;應用框架的重用,即爲專用領域提供通用的或現成的基礎結構,以獲得最高級別的重用性。
2、設計模式是對在某種環境中反覆出現的問題以及解決該問題的方案的描述,它比框架更抽象。框架可以用代碼表示,也能直接執行或複用,而對模式而言只有實例才能用代碼表示。
設計模式是比框架更小的元素。一個框架中往往含有一個或多個設計模式,框架總是針對某一特定應用領域,但同一模式卻可適用於各種應用。
可以說,框架是軟件,而設計模式是軟件的知識。
3、簡而言之:框架是大智慧,用來對軟件設計進行分工;設計模式是小技巧,對具體問題提出解決方案,以提高代碼複用率,降低耦合度。
小編總結:通過MVC的學習,我們要知道它是用來分割頁面和數據庫訪問的框架,降低了兩者的耦合度,同時通過Controller的控制,也使系統更加的靈活,使我們的代碼更健壯,複用性更強,但是凡事都有他適用的範圍,我們不能覺得它好,就不敢三七二十一的瞎用,有時可能會適得其反,因此MVC的學習還需要我們以後慢慢探討。