iOS架構設計04-MVP

上篇文章我們介紹了MVC的變種,今天我們來介紹下另一種常用的架構MVP,我們看下圖其實這個架構和Apple版MVC很像,只不過C換成了P

iOS架構設計04-MVP

MVP

那我們來看看MVP是哪三個角色

  • Model

對於Model層也是數據層。它區別於MVC架構中的Model,在這裡不僅僅只是數據模型。在MVP架構中Model它負責對數據的存取操作,例如對數據庫的讀寫,網絡的數據的請求等。

  • View

是顯示數據(model)並且將用戶指令(events)傳送到presenter以便作用於那些數據的一個接口。View通常含有Presenter的引用。在這裡通常指我們ViewController

  • Presenter

我們看Presenter的意思是主持人,既然是主持人,那肯定要來主持工作了,對於Presenter層他是連接View層與Model層的橋樑並對業務邏輯進行處理。在MVP架構中Model與View無法直接進行交互。所以在Presenter層它會從Model層獲得所需要的數據,進行一些適當的處理後交由View層進行顯示。這樣通過Presenter將View與Model進行隔離,使得View和Model之間不存在耦合,同時也將業務邏輯從View中抽離

Demo實例講解

下面我們還是沿用MVC那個Demo來看,(主要功能就是我們自定義個XXAppView,用來顯示上面一張圖,下面一行字的控件)

這次首先我們創建我們的Presenter

<code>@interface XXAppPresenter() <xxappviewdelegate>
@property (weak, nonatomic) UIViewController *controller;
@end

@implementation XXAppPresenter

- (instancetype)initWithController:(UIViewController *)controller
{
if (self = [super init]) {
self.controller = controller;

// 創建View
XXAppView *appView = [[XXAppView alloc] init];
appView.frame = CGRectMake(100, 100, 100, 150);
appView.delegate = self;
[controller.view addSubview:appView];

// 加載模型數據
XXApp *app = [[XXApp alloc] init];
app.name = @"QQ";
app.image = @"QQ";

// 賦值數據
[appView setName:app.name andImage:app.image];
}
return self;
}

#pragma mark - XXAppViewDelegate
- (void)appViewDidClick:(MJAppView *)appView
{
NSLog(@"presenter 監聽了 appView 的點擊");
}
/<xxappviewdelegate>/<code>

接著我們修改下我們的View,這次我們的View不需要持有Model,直接暴露出需要的數據給外界,

<code>- (void)setName:(NSString *)name andImage:(NSString *)image;/<code>

最後我們來修改下Controller,這回我們點擊事件Delegate不用Controller來遵循了,因為我們交由Presenter來主持管理了,所以由Presenter來遵循,那我們的Controller需要持有Presenter對象,那現在我們的Controller只負責初始化Presenter就可以了

<code>@interface ViewController ()
@property (strong, nonatomic) XXAppPresenter *presenter;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// 初始化我們的Presenter
self.presenter = [[MJAppPresenter alloc] initWithController:self];

}/<code>

總結

那首先我們看看MVP的優缺點

  • 優點

對Controller進行瘦身,View和Model之間不存在耦合,同時也將業務邏輯從View中抽離,複用性更好

  • 缺點

由於對視圖的渲染放在了Presenter中,所以視圖和Presenter的交互會過於頻繁。還有一點需要明白,如果Presenter過多地渲染了視圖,往往會使得它與特定的視圖的聯繫過於緊密。一旦視圖需要變更,那麼Presenter也需要變更了

之前我們也說了架構這種東西是沒有唯一的,今天只是說了我理解和實現的一種方案,其實有很多種方案,我們定了這三個角色之後,這三個角色之間怎麼交互,大概的交互流程規定好就可以,具體的細節,可以根據你的習慣或者項目的不同進行修改

今天就先介紹到這裡,明天我們來看看MVVM,還有近期在學習數據結構和算法,小程序,Flutter,我會把筆記都記錄下來的


分享到:


相關文章: