美文网首页
架构设计-mvp实战

架构设计-mvp实战

作者: 妮妮世界 | 来源:发表于2017-07-08 20:30 被阅读0次

    MVP

    概念

    是MVC模式的一个演化版本,全称Model-View-Presenter。

    Model:主要提供数据的存储功能,一般都是用来封装网络获取的json数据的集合。Presenter通过调用Model进行对象交互

    View:这个View可以是viewcontroller、view等控件。Presenter通过向View传model数据进行交互。

    Presenter:作为model和view的中间人,从model层获取数据之后传给view,使得View和model没有耦合

    好处

    Presenter:作为model和view的中间人,从model层获取数据之后传给view,使得View和model没有耦合

    View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。

    Presenter与View的交互是通过接口来进行的。

    通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。

    概念图

    1.png

    逻辑图

    2.png

    实际项目思路图

    ![Uploading 3_964006.png . . .]

    项目文件结构

    3.png

    看出一个模块有4个文件夹,model
    ![Uploading 4_975977.png . . .]
    ,controller,presenter,view

    home的HomePresenter 继承与基本的presenter,是根据home的业务实现的presenter

    项目关键代码截图

    网络层

    httpClient 数据请求部分

    
    typedef NS_ENUM(NSInteger, HTTPRequstType) {
        HTTPRequstNothing,
        HTTPRequstHomeList,
    };
    
    @protocol HttpResponseHandle;
    
    @interface HttpClient : NSObject
    
    /*
     *方法名称:initWithResponseHandle:
     *方法描述:初始化函数
     *输入参数:(id<HttpResponseHandle>) responseHandle:解析delegate
     *返回值:HttpClient 对象
     */
    -(instancetype)initWithResponseHandle:(id<HttpResponseHandle>) responseHandle;
    
    /*
     *方法名称:requstDataWithType:info:
     *方法描述:根据接口的枚举请求数据
     *输入参数:type:接口枚举值,info:参数字典
     *返回值:nil
     */
    - (void)requstDataWithType:(HTTPRequstType)type info:(NSDictionary *)dic;
    
    

    HttpResponseHandle:响应解析器部分

    @protocol HttpResponseHandle <NSObject>
    
    @required
    
    /*
     *方法名称:requestSuccess:
     *方法描述:请求成功
     *输入参数:responseDic:数据对象
     *返回值:nil
     */
    - (void)requestSuccess:(NSDictionary* )responseDic;
    
    /*
     *方法名称:requstFailWithErrcode:des:
     *方法描述:请求失败
     *输入参数:errorCode:错误代码 errorStr:错误描述
     *返回值:nil
     */
    
    
    - (void)requstFailWithErrcode:(NSInteger)errCode des:(NSString*)errorStr;
    

    HttpPresenter:外界访问网络数据接口

    拥有httpClient ,实现请求响应器方法,实际什么也不做,目的是让其UI层的子类重写

    @interface HttpPresenter<E> : Presenter<E> <HttpResponseHandle>
    
    @property (nonatomic,strong)HttpClient *httpClient;
    
    @end
    
    

    UI层

    HomeModel模型文件

    HomeViewProtocol:页面属性代理

    HomePresenter:

    继承与httpPresent,提高对应V的数据请求接口,
    重写数据响应器方法,在方法中通知模型组建对象,并使用新model刷新V

    #import "HttpPresenter.h"
    
    
    /*
     *被homeCon拥有, 实现网络请求响应器HttpResponseHandle,
     *并调用homeCon的数据刷新方法来刷新homeCon
     */
    @interface HomePresenter : HttpPresenter 
    
    /*
     *方法名称:getHomeList:
     *方法描述:获取首页列表数据
     *输入参数:nil
     *返回值:nil
     */
    
    - (void)getHomeList;
    
    #pragma mark - HttpResponseHandle
    
    - (void)requestSuccess:(NSDictionary *)responseDic
    {
        /*
         *根据网络请求结果构建首页模型
         */
        HomeModel *homeModel = [[HomeModel alloc] initWithDic:responseDic];
        if(homeModel )
        {
            if(_view  && [_view respondsToSelector:@selector(onGetHomeListSuccess:)])
            {
                [_view onGetHomeListSuccess:homeModel];
            }
        }
        else
        {
            if (_view && [_view respondsToSelector:@selector(OnGetHomeListFail:des:)])
            {
                [_view OnGetHomeListFail:0 des:@"暂无数据"];
            }
            
        }
        
        
    }
    
    

    范型基类(Presenter)

    弱饮用V.提供P的初始化方法

    @interface Presenter<E> : NSObject
    {
        //MVP中负责更新的视图,可能是viewcon 也可能是view
        //因为view 强引用 presenter 故此处用weak
        __weak E _view;
    }
    
    /*
     *方法名称:initWithView:
     *方法描述:初始化函数
     *输入参数:view:负责更新的视图
     *返回值:Presenter 对象
     */
    - (instancetype)initWithView:(E) view;
    
    

    MVP总结

    mvp 真正的打断了了m v 的交互,

    通过p作为中间桥梁,p请求数据,然后组建模型,通知v 刷新,

    v 可以是viewcontroller 也可以是view ,而且v与p一一对应,是将部分的v的业务逻辑放入p中处理,并且v不处理任何数据,只负责视图展示和通过新的模型数据刷新,

    对于一些v的操作,可以直接发送给p处理,p主要处理业务逻辑,v仅仅负责展示和刷新

    相关文章

      网友评论

          本文标题:架构设计-mvp实战

          本文链接:https://www.haomeiwen.com/subject/oyyjhxtx.html