进入苏宁一个月了,刚做完苏宁易购的以旧换新功能,在这里总结一下当前项目的MVP模式。
mvp简介
mvp的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。具体介绍就不复制了,参考网上大佬的介绍或者百度百科都行。
先说下mvp的逻辑,MVP可以分成model,view,controller,present四个部分,其中view负责展示,present负责数据处理,controller负责流程,model辅助上面三个进行交流和传值。
案例
这么写太笼统了,还是写个demo来解释吧。
打个比方,我现在有个需求,需要依次请求三个接口,然后将接口的数据整理成一个字符串,展示在页面的label上。
如果使用mvc模式的话,我会在controller中写3个请求,依次调用并且解析数据,这样就导致所有的逻辑都集中在controller中,controller代码会很多。同时,如果服务端某个接口没完成,我们需要修改许多地方,甚至可能需要修改整体流程,来进行测试数据模拟。
现在换成mvp模式,我会将请求和数据整合封装成present中的单独方法,这样在controller中就只需要进行方法调用即可。同时,如果需要进行数据测试,只需要修改阻塞的接口方法和数据整合方法即可。
@implementation MVPPresent
-(void)request1:(requestVoidBlock)block{
//......
block();
}
-(void)request2:(requestVoidBlock)block{
//......
block();
}
-(void)request3:(requestVoidBlock)block{
//......
block();
}
-(MVPTestModel *)requestResult{
self.requestModel.text = @"123";
return self.requestModel;
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor purpleColor];
[self.view addSubview:self.mainView];
__weak typeof(self) wself = self;
[self.present request1:^{
[wself.present request2:^{
[wself.present request3:^{
wself.mainView.model = [wself.present requestResult];
}];
}];
}];
}
优点
-
在我看来,mvp最大的优点是其解藕性
-
UI集中在view中,流程集中在controller中,数据处理集中在present中,这样遇到修改需求或者需要测试数据的时候,很容易找到需要修改的位置并修改。
-
而且非常易于复用,无论是present还是view都可以进行复用。这样在多个页面接口一致的情况下,可以节省大量的代码量。
总结+吐槽
第一次写博客,感觉写的很烂但又不知道该怎么改,先这样吧,等我熟练了再详细写一篇设计模式吧。大神请轻喷😊
最后附上demo地址:https://github.com/zdz00003/MVPDemo
网友评论