最近我朋友問了我一個問題，MVP和MVC架構有甚麼不一樣，我只很簡單的回答，MVP比較運用於Win Form、ASP.NET這種有狀態的程式，而MVC運用於無狀態的應用程式；事過幾天後，我還是覺得，這個問題很不錯，但因沒有好好地回答感到遺憾XDD，雖然現在網路上也有很多的"VS”了，但我還是決定把這一些模式敘說一次。
其實MVP模式是MVC模式演進而來的，也可能MVC剛出來的時代，網路還沒開始發展，所以MVC不適用於Win Form這類程式架構，而衍生出MVP模式；但不管怎樣，他們要解決的問題，原因都相同，都是原本的架構不易測試，耦合太高，關聯太複雜，所以使用這些模式來解決這些問題，總之，測試是很重要的=w=。
老實說，我也不是考古團隊，我也沒有仔細的去翻歷史，但據我所知，MVP設計模式是有分兩種，最先提出來的是Martin Fowler，最後於2006年將MVP分成Supervising Controller和Passive View；基本上這兩個的概念是相同的，但最大的差別只在於那個"P" ( 也就是Presenter )，Presenter能控制的東西程度不同罷了，而這次的主題就是其中一個MVP模式Passive View。
首先，既然是MVP還是要說明一下這三個字的縮寫，分別為Model、View、Presenter，翻成中文，大概也就是模型、視圖、主講者!? ( 好吧，我還是用英文Presenter好了… ) ，以下是他的圖。
如果要說MVP的Passive View，最簡單的講法就是Model與View是完全沒溝通的，也就是說Presenter有絕對的控制權( 控制控阿!! )。
自從上次講了MVC架構後，發現與其一開始說那麼多，大家還是聽不懂，還不如直接先給範例，就如比古清十郎所說的，從實戰中學習吧!劍心~。
而在準備View之前，也必須先準備好Interface，"IDefault2DetialView”，然後裡面定義了SearchUser、UserNmae、UserAddress三個必須實作的方法，其實這三個方法，對應的就是SearchUserTextBox、UserNameLabel、UserAddressLabel這三個控制項，目的是希望未來透過此方法來存取這三個控制項，也因為我們的程式只需要取得SearchUserTextBox的Text值，和設定UserNameLabel和UserAddressLabel的值，所以裡面也只分別設定get和set。
ok~接下來我們要處理Default2.cs了，雖然程式很簡單，但還是很長，而且有很多地方需要注意的，首先，我們會讓此類別( _Default2 )去實作此介面，目的也是一樣，為了降低耦合與測試。而我們也會在這個類別裡面去實作Presenter，目前我們還沒寫到Presenter，但這邊會用到Presenter的原因其實很簡單，因為是由Presenter來控制，如最下面的Button Click所看到，我們沒有將程式寫在_Default2裡面了，而是去呼叫Presenter的OnUserSearched方法；接下來往回看一點，有三個存取控制項的方法，這些方法會回傳或是設定控制項，最後，最關鍵的是new Presenter(this)這段，這段也就是說把_Default2塞到Presenter裡面去，讓Presenter能參照到_Default2，這代表甚麼呢?也就是說，Presenter可以控制到_Default2，所以Presenter裡面不會再有SearchUserTextBox.Text這種和控制項有關的程式碼，而通通都是透過_Default2所定義的方法來取得控制項的資訊，換言之，Presenter和控制項再也無關，View就是View，Presenter就是Presenter，個兼其職。
//將自己，也就是_Default2注入到P裡面去，目的是為了讓P能控制View。
//此類別必須實作IDefault2DetialView定義的方法。
//可以看到，這裡就是用來設定控制項。
然後我們看一下Presenter，其實Presenter還比較簡單一點，如果你已經看到這邊，恭喜你，快解脫了XDD；Presenter，會定義兩個介面，而利用建構子的方式傳進有實作這兩個介面的物件，換言之，當我們要測試的時候，就可以傳入有實作這兩個介面的物件進來 ( 通常我們使用Mock來做模擬物件 )，而這也是為什麼前面要一直定義介面的關係，就是為了降低耦合，讓測試能更好進行，至於OnUserSearched方法，其實和之前的程式沒有多大改變，就只是進行了資料撈取的動作，只是不會直接寫到控制項裡面去了，而是會透過實作IDefault2DetialView的物件來進行存取的動作，好處就如之前說的，隔離了控制項的部分，讓耦合降更低。
這個範例，我忘記把_default2改成比較好的名子，所以一堆相關的命名都是這種沒有意義的Default2，這是不好的習慣喔!!大家不要學習喔!!。