你在企业真用过MVP模式写代码吗,简单不用学,看一遍你也会!!!

111

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模式的进一步抽象 **

青山不改,绿水长流 ,谢谢大家

posted @ 2022-03-14 18:12  一眼万年的星空  阅读(60)  评论(0编辑  收藏  举报