你在企业真用过MVP模式写代码吗,简单不用学,看一遍你也会!!!
MVP,面向协议的设计模式
简介
从上图看出,在MVC基础上,又抽象出了P层,即Presenter层。
● MVP的V层是由UIViewController和UIView共同组成的。
● View将委托Presenter对自己进行操作(Presenter发命令控制View的交互,隐藏orshow之类的)(Presenter拥有对View交互的逻辑)
● Presenter跟Model层通信,并将数据转化成适应UI的数据并更新View
● Presenter不需要依赖UIKit
● view层是单一,因为它是被动接受命令,没有主动能力。
● Controller其实将View 和 ViewController传递给了P层,这样P层其实就拥有了控制器的权利,完全可以行使控制器的职责。
● Controller又持有Presenter,那么它只需要调用P层暴露出的接口,就完全可以完成整个业务逻辑和页面展示。
关于 C端和 P端的循环引用问题,用weak关键字就可以解决了
presenter 作为业务逻辑的处理者,首先要向Service层拿数据赋值给model,所以它将可以向model层通信。其次,UI的处理权移交给了它,所以它需要与view层通讯,发送命令更新UI。同时,UI的响应将触发业务逻辑的处理,所以view 层向presenter层通讯,告诉他用户做了什么操作,需要你反馈对应的数据来更新UI。这样就完成了从用户交互获得交互反馈到整个业务逻辑。
代码演示
Presenter协议
//Presenter 的 Protocol, 所有P层的类都要遵循这个Protocol
#import /*
作为P : presenter 是管理 view viewController model这个三个中间人,负责UI刷新
视图的交互总是和VC 关联着的
*/
@protocol TGPresenterProtocol @optional
// 处理View视图相关操作 -- 协议的遵守者
- (void)setView:(NSObject *)view;
// 处理事件的相关响应
- (void)setViewController:(UIViewController *)viewController;
// 展示
- (void)present;
// 加载model
- (void)presentWithModel:(id)model viewController:(UIViewController *)viewController;
@end
上面的代码,将tableView的数据源和代理都给了P,那么P就相当于行使了控制器的权力,当P层拿到数据时(P层持有Model)----
- (void)loadHPData{
NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"testCellData" ofType:@"json"];
NSData *jsonData = [NSData dataWithContentsOfFile:dataPath];
NSError *error;
NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
if (error) {
NSLog(@"error = %@",error.localizedDescription);
}
NSLog(@"dataDic = %@",dataDic);
// model 要处理好数据的显示格式
self.hpModel = [[CellSelfSizeModel alloc] initWithDic:dataDic];
// 刷新
[self present];
}
走Present方法(实际就是tableView的reloadData),接着自动重走数据源方法,将数据分发给cell去展示
总览
这样就实现了*8Controller,View,Model的解耦,Controller部分的代码---
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"MVP Demo";
// 布局
[self initViews];
[self setUpConstraints];
self.hpPresenter = [TGHPPresenter new];
// 视图对象
self.hpPresenter.view = self.tableView;
// 控制器对象
self.hpPresenter.viewController = self;
// 外边是要传入参进去的 -- 数据模型
[self.hpPresenter loadHPData];
}
只需要初始化P层,然后调用P层的接口就可以了。至于P层内部的逻辑,不需要知道!!
如此一来:
● V层也只专注于视图的创建
● M层只专注于模型的构建
● 这样分层,解耦的思想在程序设计中是极为重要的,其实也可以看出 **MVP是对MVC模式的进一步抽象 **