Software Design Architecture — MVP

Journey on programming
4 min readNov 5, 2017

--

大家好,繼上一篇文章談論到 MVVM 之後,想要趁著這一波的熱潮,一並把 MVX 系列家族一起講完,這次要跟大家聊聊的主題是 MVP !

在 MVP 當中,就像我們在前一篇 MVVM 當中所提到的,View 依然是擔任被動的角色,只負責處理顯示資料,除了與資料有關的事情,其他都不會在這一個角色上負責。而 Model 的角色跟其他 MVX 家族一樣,負責做一些資料或商業邏輯的處理。

主要的差別部分在於 Presenter ,何謂 Presenter?

我這邊自己的想法是,他其實是跟 ViewModel 一樣的角色,處理一樣的事情。只是有幾個差別的地方而已,讓我對你慢慢道來…

在 MVP 中,Presenter 是不能直接與 View 直接進行溝通的,必須透過 Protocol,很像之前跟大家談過的 Delegate 的概念。

Presenter 有資料,可是他不想自己做顯示,他想找人幫他顯示資料。但不是每個人都可以幫上這個忙,必須要符合 protocol 的人才可以來處理這些事。

實際上在處理的時候,我們可能在 protocol 當中宣告一些刷新的方法,然後讓 View Controller Conform 這個 Protocol 之後 ,去實現一些畫面刷新的方法,然後讓 Presenter 透過 delegate 去呼叫這些方法來把資料拿出來做顯示。

也就是說在 Presenter 當中,會透過一個 delegate 的變數,直接去存取 View 來幫他做事情。所以在 MVP 當中,View 擁有 Presenter,可是 Presenter 也可以透過 Protocol 存取 View。

上面聊過 MVP 之後,我們來談談,那到底跟 MVVM 不一樣的地方在哪邊?

我自己認知的大概有幾點,拿出來跟大家分享,如果有新的想法也歡迎讓我知道!

  1. 存取 View 的方法

兩者都是 View 擁有 Presenter/ViewModel ,可是在 ViewModel 之中,很單純的就只是做資料的顯示,沒有辦法存取到 View 本身。所以我們自然無法透過 View Model 來做畫面刷新的動作了。

但在 MVP 中呢? 因為可以透過 delegate ,只要在 View 實作 Protocol 的時候,先定義好自己想要做的事情,接著就可以呼叫 delegate 來幫你做事了。

2. 資料如何更新?

在 MVP 中,可能很單純的只是把資料擺到要顯示的 UI 容器中

cell.textLabel.text = presenter.getText()

但是在 MVVM 中,比較常的會用到 RxSwift 的寫法,這塊我也還沒研究,只知道他讓 string 具有 reference 的方式,也就有點類似 objective-c 現在的處理方式。如此一來當資料發生變動的時候,我們即使沒有寫到下列的程式碼

tableView.reloadData() 

介面一樣會更新!

但是有沒有辦法在純 swift 的環境下完成這個目的呢?

有的,可以透過 KVO / Notification 來追蹤物件的變化,一但物件發生變化,就可以把值ㄧ並完成更新了。

說完了這兩點,其實自己有有點心虛。

因為其實這兩個方式不管在 MVP 或是 MVVM 當中,都是可以去進行的。所謂的 design pattern 只是給你一個概念,讓你完成分工這件事情。分工分的細,程式沒問題!

下列是我自己寫的一個 MVP 架構的 Random User,也歡迎大家參考看看主要架構的模樣,有任何問題歡迎提出來討論囉!

圖片皆來自 google search,如果有侵權請來信告知,將會立即下架,謝謝!

--

--

Journey on programming
Journey on programming

Written by Journey on programming

Software Developer at 91APP. If you like my articles, please clap and follow me on Medium. Never stay still, never plateau!

Responses (1)