我实践中的mvp架构

Ray幸福的生活 Ray幸福的生活     2022-12-09     520

关键词:

我实践中的mvp架构

在Android开发实践中,我也深刻理解到一个项目的架构稀烂会带来什么,成天的找bug,解决了一个bug,又出现了两个bug,这样的事肯定会经常出现。所以呢我决定使用传说中的mvp,这是15年年底的事,经过这么久了,想想也可以稍微写点东西。

  • MVP架构介绍
  • MVP架构图对比
  • 总结

mvp架构介绍

参考
软件架构的依赖规则:

软件是分层的,高层是基础业务逻辑和策略,低层是实现机制和展现形式。代码和数据依赖只能是低层代码依赖高层,而不能反过来。

什么是MVP?
MVP是Model, View和Presenter的简称。是非常有名的MVC模式的演化版。MVP模式把显示逻辑和从业务逻辑层中分离出来,理想状况下,MVP模式中,在替换不同的视图(View)的情况下,可以实现完全相同的业务逻辑。

Presenter代替了MVC中Controller,它比Controller担当更多的任务,也更加复杂。Presenter处理事件,执行相应的逻辑,这些逻辑映射到Model的Command以操作Model。那些处理UI如何工作的代码基本上都位于Presenter。Presenter如同一个乐队的指挥家,表现和协调整个Application,它负责创建和协调其它对象。

MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。

为什么使用MVP模式
因为在Android中,Activity严重耦合了界面和数据获取层。这样不仅导致了Activity的类越来越庞大,而且,如果修改数据获取层,可能也导致整个View都要重写。也非常不利于模块和自动化测试。

MVP使View独立于数据,把大量的逻辑从Activity中提取出来。把应用分层,每层都可以独立测试和变动。

MVP模式是如何工作的
MVP模式中的角色划分并没有标准的划分方法。大致的定义如下:

表示器(Presenter)
表示器也可以称为指挥器,它处在View和Model之间,负责从Model中获取数据,然后返回给View。同时决定视图上的交互的处理。

视图(View)
视图比较好理解,在Android中一般对应的是Activity,Fragment或者View。因为视图上的交互需要通知表示器,让它决定做什么事情。所以View中一般包含一个Presenter的引用。理想状况下,Presenter一般使用依赖注入的方式实现。

模型(Model)
模型是应用程序中的数据处理和业务逻辑部分。


MVP架构图对比

传说中的mvp架构图:

传说中的mvp架构图实现代码
具体代码请参考:https://github.com/ray0807/ShareFramework


其实从代码中也可以看到一个activity就会跟一个IView 当然啦,这也是为了更好的解耦和,本人是从心底里赞同的,但是有些小项目,说实在的,需要更敏捷,更快速,所以呢,我自己在开发的时候也有一套自己的实现方式,实现原理图与上面的原理图差不多

ZebraPresenter(购物车presenter)这里是整个模块的presenter,并不是一个activity就有一个IView,这里的IView被presenterCallback代替,传回的数据也有T 代替(这样就可以满足一个presenter传递多种数据啦)

/**
 * 购物车实现
 * @author wangl01
 *
 */
public class ZebraPresenter extends Presenter 
    private PresenterCallBack callback;
    private ZebraGoManager manager;
    private Page currentPage;

    public ZebraPresenter(PresenterCallBack callback) 
        manager = new ZebraGoManager();
        this.callback = callback;
    

    private <T> void sendData(PresenterData<T> data) 
        if (callback != null) 
            callback.callBackPresenter(data);
        
    

    public void getZebraProductShowList(Context c) 
        manager.getZebraGoHomepage(c, new NListener<BaseData>() 

            @Override
            public void onResponse(BaseData data) 
                List<ZebraHomePageProductBean> productTypeList = null;
                List<ZebraHomePageBusinessBean> businessList = null;
                if (data.status == 0) 
                    productTypeList = data.data.productTypeList;
                    businessList = data.data.businessList;
                
                sendData(new PresenterData<List<ZebraHomePageProductBean>>("zebra_product", productTypeList));
                sendData(new PresenterData<List<ZebraHomePageBusinessBean>>("zebra_onsell", businessList));

            

            @Override
            public void onErrResponse(VolleyError error) 
                sendData(new PresenterData<List<ZebraHomePageProductBean>>("zebra_product", null));
                sendData(new PresenterData<List<ZebraHomePageBusinessBean>>("zebra_onsell", null));
            

            @Override
            public void onAllPageLoaded(int nowPage, int totalPage) 

            
        );

    

acitivity实现

/**
 * 购物车
 * @author wangl01
 *
 */
public class ZebraShoppingCarActivity extends BaseActivity
        implements OnClickListener, PresenterCallBack, OnItemClickListener, OnRefreshListener2<SwipeMenuListView> 
    private NavigationBar navbar_activity_shopping;
    private LoadingSwipeMenuListView smls_shoppingCar;

    private ZebraGoShoppingCarAdapter adapter;

    private ZebraPresenter presenter;
    private Handler mHandler = new Handler() 
        public void handleMessage(android.os.Message msg) 
            switch (msg.what) 
            case Constant.FRESH_COMPLETE:
                smls_shoppingCar.onRefreshComplete();
                break;
            default:
                break;
            

        ;
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zebra_shopping_car);
        EventBus.getDefault().register(this);
        findViews();
        init();
        addListeners();
    

    @Override
    protected void onDestroy() 
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    

    @Override
    public void findViews() 
        presenter = new ZebraPresenter(this);
    

    @Override
    public void init() 
        //节省空间,不需要的代码已被删除
        presenter.getZebraShoppingCar(this, isRefresh);

    

    /**
     * presenter 回调
     */
    @Override
    public <T> void callBackPresenter(PresenterData<T> data) 
        refreshComplete();
        T t = data.data;
        if (t == null) 
            return;
        
        //为了简化,此处我用的字符串,亲们不要学我
        if ("zebra_shopping_car".equals(data.tag)) 
            shoppingCarData = (List<ShoppingCarBean>) t;
            if (shoppingCarData != null) 
                setShoppingCar();
            
        
        if ("completed".equals(data.tag)) 
            int flag = (Integer) t;
            if (flag == 0) 
                refreshComplete();
                smls_shoppingCar.disableLoading();
                smls_shoppingCar.OnLoadingFinished();
            
        
        if ("ZebraBusinesSsettle".equals(data.tag)) 
            BaseData bean = (BaseData) t;
            if (bean != null) 
                if (bean.status == 0) 
                //````
                 else 
                    ToastMgr.show("结算失败");
                
            
        

    

看看项目结构(亲们不要吐槽我还在使用eclipse,公司要求,其实我的内心还是属于Android studio)

结合上面的代码,其实你会发现我全工程只有一个IView接口,但是数据类型都是可以回传的,这里还是感谢java泛型的功劳。


总结

总结下我这样做有什么好处呢。其实我的项目中会少很多接口,你也不用写view 的时候使劲的去定义IView接口,毕竟一开始大家都不会花太多时间去定义数据结构(至少我不会),所以呢我不会给定你数据结构,给你一个T ,你可不要打我(这可不是打篮球)。再者想想,我只有一个IView接口,接口是不是少了很多?类也少了很多。写起来得心应手啊有木有。

  • 一个T 解决数据结构

  • 接口只需要定义一个

  • 同样有mvp结构带来的便利(我曾经一天调了将近20个接口,当然是稍微简单的接口)

好咯,有兴趣请关注我的github:https://github.com/ray0807/

google官方androidmvp架构实践(代码片段)

一、Google官方MVP介绍近期,关于Android开发架构的讨论沸沸扬扬,各大技术平台随处可见关于Android架构的技术文章。MVC、MVP、MVVM等等,就目前的形式来看,MVP模式在Android开发领域界逐渐流行了起来。前段时间࿰... 查看详情

mvp架构。。。。

...为MVC的变种MVP模式,也已经出现好几年了,在微软模式与实践小组提供的WebClientSoftwareFactory中,给出了实现M 查看详情

具有 MVP 架构的 Mockito retrofit2

...】:2019-02-1105:30:49【问题描述】:我认为我在TeamImplsTest中的代码有问题,我需要建议:D这是我的代码API接口interfaceAPI@GET("lookupteam.php")fungetTeam(@Query("id")id:String):Call<T 查看详情

安卓实践开发之mvp一步步实现到高级封装

在上家干了快2年辞职后在家休息了快一个月了,说实在的不上班的感觉爽(睡觉睡到自然醒,游戏玩到手抽筋)。哈哈,又是快到一年过中秋的时候了,好久没有更新博客了,今天顺便撸一篇。前言话说MVP的模式已经问世好几年... 查看详情

MVC和MVP架构之间的区别[重复]

】MVC和MVP架构之间的区别[重复]【英文标题】:DifferencebetweenMVC&MVParchitecture[duplicate]【发布时间】:2011-08-1510:44:54【问题描述】:可能重复:WhatareMVPandMVCandwhatisthedifference?我不了解MVC和MVP编码设计流程。我需要了解编码方面的... 查看详情

android开发中的mvp架构(转)

  写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect&n 查看详情

清洁架构与 MVPC/MVC/MVP [关闭]

】清洁架构与MVPC/MVC/MVP[关闭]【英文标题】:CleanArchitectureVsMVPC/MVC/MVP[closed]【发布时间】:2017-02-2202:13:47【问题描述】:我正在研究UncleBobCleanArchitecture,并试图在我的IOS/Android项目中使用女巫设计模式的许多不同方面进行比较。... 查看详情

mvc-mvp-mvvm架构调研及实现--分布式课程思考题--zzb

...5变种MVC6Mvp8MVVM9对比和分析不同模式的特点和优缺点11IV.实践过程12实验设计和方法描述12MVVM模式实践14VI.结论和展望16总结研究成果和贡献16对未来研究方向和发展趋势的展望16VII.参考文献17I.引言研究背景和动机研究背景是分布... 查看详情

在颤振中使用 MVP 架构的 Chopper

】在颤振中使用MVP架构的Chopper【英文标题】:ChopperusingMVPArchitectureinflutter【发布时间】:2020-06-0106:59:39【问题描述】:我正在使用Chopper调用api,我想得到结果json,这是我要调用的API[https://api.jsonbin.io/b/5e1219328d761771cc8b9394]我想问... 查看详情

实践中的应用程序架构 - Bob 大叔 [关闭]

】实践中的应用程序架构-Bob大叔[关闭]【英文标题】:ApplicationArchitectureinpractice-UncleBob[closed]【发布时间】:2012-04-2103:49:24【问题描述】:根据鲍勃叔叔/source/的说法,每个用户故事都应该有单独的“集成器/控制器”。听起来不... 查看详情

mvp-浅析如何高效的使用mvp

...址:http://blog.csdn.net/dantestones/article/details/51445208Androidmvp架构的自述中我简单的介绍了mvp,以及怎么写mvp。我自己也将mvp运用到了项目中,其实mvp并没有固定的写法,正确的去理解架构的思想,都可以有自己独特的mvp写法。git上... 查看详情

google官方mvp模式示例项目解析todo-mvp

...都有或多或少的问题。第一种常见问题是没有架构,需求中的一个页面对应项目中的一个activity或一个fragment,所有的界面响应代码、业务逻辑代码、数据请求代码等等都集中在其中。第二 查看详情

n 分层架构中的实体框架 - 要遵循的最佳实践?

】n分层架构中的实体框架-要遵循的最佳实践?【英文标题】:EntityFrameworkinantieredarchitecture-BestPracticestofollow?【发布时间】:2010-12-2502:30:48【问题描述】:我一直在阅读MSDN文章http://msdn.microsoft.com/en-us/magazine/cc700340.aspx但想知道在... 查看详情

mvp在flutter中的应用(代码片段)

...件不变。我们首先要定义一个Contact类,用于表示通讯录中的每一项,接着还要定义一个数据仓库接口ContactRepository,用于获取数据,代码如下:import‘dart:asy 查看详情

readhub项目kotlin版开发指南(mvp架构)(代码片段)

...络请求)ReadHub项目Kotlin版转换指南(三、MVP架构)Android开发中的MVP架构相信大家都已经熟悉,不熟悉的请右转Google,ReadHub项目从Java转换成Kotlin过程中,我们需要一套新的架构方式来实现(Kotlin项目中没有使用dagger2)。base为MVP架构... 查看详情

Android MVP 架构 - 存储库和视图之间的通信

】AndroidMVP架构-存储库和视图之间的通信【英文标题】:AndroidMVParchitecture-communicationbetweenrepositoryandview【发布时间】:2017-05-1219:38:16【问题描述】:我正在学习给定here的AndroidMVP架构。根据示例,我创建了自己的简单应用程序,... 查看详情

markdownrecyclerview最佳实践(传统,非mvp方法)(代码片段)

查看详情

mvp架构简析--高上(代码片段)

...显示;Control控制器可以理解为M和V的桥梁,Mode层中的数据变化有C告诉V,然后V再呈现给用户比如lis 查看详情