1. 程式人生 > >淺談MVC架構—你到底有什麼本事

淺談MVC架構—你到底有什麼本事

一、什麼是MVC

    1、概念

        MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。

        小編點睛:MVC就是類似三層的一種架構,主要還是採用封裝(分層)的思想,來降低耦合度,從而使我們的系統更加的靈活,擴充套件性更好。

    2、內容

      Model(模型)是應用程式中用於處理應用程式資料邏輯的部分。通常模型物件負責在資料庫中存取資料
      View(檢視)是應用程式中處理資料顯示的部分。通常檢視是依據模型資料建立的
      Controller(控制器)是應用程式中處理使用者互動的部分。通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料

小編點睛:

          

    3、優點

       (1)首先,最重要的一點是多個檢視能共享一個模型。同一個模型可以被不同的檢視重用,大大提高了程式碼的可重用性
(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 ;
        }
    }

       (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();
        }
    }

       (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>

       (4)執行效果圖

                                

三、框架VS設計模式

    1、框架通常是程式碼重用,而設計模式是設計重用,架構則介於兩者之間,部分程式碼重用,部分設計重用,有時分析也可重用。

      在軟體生產中有三種級別的重用:內部重用,即在同一應用中能公共使用的抽象塊;程式碼重用,即將通用模組組合成庫或工具集,以便在多個應用和領域都能使用;應用框架的重用,即為專用領域提供通用的或現成的基礎結構,以獲得最高級別的重用性。

    2、設計模式是對在某種環境中反覆出現的問題以及解決該問題的方案的描述,它比框架更抽象。框架可以用程式碼表示,也能直接執行或複用,而對模式而言只有例項才能用程式碼表示。

     設計模式是比框架更小的元素。一個框架中往往含有一個或多個設計模式,框架總是針對某一特定應用領域,但同一模式卻可適用於各種應用。

      可以說,框架是軟體,而設計模式是軟體的知識。

    3、簡而言之:框架是大智慧,用來對軟體設計進行分工;設計模式是小技巧,對具體問題提出解決方案,以提高程式碼複用率,降低耦合度。

        小編總結:通過MVC的學習,我們要知道它是用來分割頁面和資料庫訪問的框架,降低了兩者的耦合度,同時通過Controller的控制,也使系統更加的靈活,使我們的程式碼更健壯,複用性更強,但是凡事都有他適用的範圍,我們不能覺得它好,就不敢三七二十一的瞎用,有時可能會適得其反,因此MVC的學習還需要我們以後慢慢探討。