MVP详解+代码实例

MVP模式

之前有一个MVC模式: Model-View-Controller.
MVC模式 有两个主要的缺点: 首先, View持有Controller和Model的引用; 第二, 它没有把对UI逻辑的操作限制在单一的类里, 这个职能被Controller和View或者Model共享.
所以后来提出了MVP模式来克服这些缺点.

MVP(Model-View-Presenter)模式:

  • Model: 数据层. 负责与网络层和数据库层的逻辑交互.
  • View: UI层. 显示数据, 并向Presenter报告用户行为.
  • Presenter: 从Model拿数据, 应用到UI层, 管理UI的状态, 决定要显示什么, 响应用户的行为.
    MVP模式的最主要优势就是耦合降低, Presenter变为纯Java的代码逻辑, 不再与Android Framework中的类如Activity, Fragment等关联, 便于写单元测试.

模式特点

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

优点

1、模型与视图完全分离,我们可以修改视图而不影响模型
2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)


MVP模式的应用



  一.model层描述和具体代码


public interface IGirlModel {
    /**
     * 也通过回调的方式返回数据
     * @param girlOnLoadListener
     */
    void loadGirl(GirlOnLoadListener girlOnLoadListener);

    /**
     * 设置一个回调接口
     */
    interface GirlOnLoadListener{
        void onComplete(List<Girl> list);
    }
}



public class IGirlModelImpl implements IGirlModel{
    @Override
    public void loadGirl(IGirlModel.GirlOnLoadListener girlOnLoadListener) {
        List<Girl> data = new ArrayList<Girl>();
        data.add(new Girl("http://pic3.16pic.com/00/16/45/16pic_1645919_b.jpg", "*****", "123"));
        data.add(new Girl("http://pic33.photophoto.cn/20141111/0005018398216909_b.jpg", "", ""));
        data.add(new Girl("http://pic31.nipic.com/20130729/8952533_180901746000_2.jpg", "5", ""));
        data.add(new Girl("http://pic12.photophoto.cn/20090911/0036036808900539_b.jpg", "5", ""));
        data.add(new Girl("http://pic3.16pic.com/00/16/45/16pic_1645919_b.jpg", "5", ""));
        data.add(new Girl("http://imgsrc.baidu.com/imgad/pic/item/f2deb48f8c5494ee4f79f13a27f5e0fe99257ebe.jpg", "5", ""));
        data.add(new Girl("http://pic3.16pic.com/00/16/45/16pic_1645919_b.jpg", "5", ""));
        data.add(new Girl("http://pic3.16pic.com/00/16/45/16pic_1645919_b.jpg", "", ""));
        data.add(new Girl("http://imgsrc.baidu.com/imgad/pic/item/f2deb48f8c5494ee4f79f13a27f5e0fe99257ebe.jpg", "5", ""));
        data.add(new Girl("http://pic3.16pic.com/00/16/45/16pic_1645919_b.jpg", "5", ""));
        girlOnLoadListener.onComplete(data);
    }
}

二.view层描述和具体代码


/**
 * 所有的UI逻辑
 */
public interface IGirlView {
    /**
     * 显示listView中的数据(用回调)
     */
    void showGirls(List<Girl> girls);
}


三. presenter层描述和具体代码


/**
 * 所有的业务逻辑都在表示层完成
 */

public class GirlPrecenter<T extends IGirlView> {
    /**
     * 1.view层的引用
     */
    WeakReference<T> mView;
    /**
     * 2.model层的引用
     */
    IGirlModel iGirlModel=new IGirlModelImpl();

    public GirlPrecenter(T view){
        this.mView=new WeakReference<T>(view);
    }

    /**
     * 3.执行UI逻辑操作
     */
    public void fetch(){
        if(mView.get()!=null && iGirlModel!=null){
            iGirlModel.loadGirl(new IGirlModel.GirlOnLoadListener() {
                @Override
                public void onComplete(List<Girl> list) {
                    mView.get().showGirls(list);
                }
            });
        }
    }
}

demo下载: 点击打开链接

MVP参考:

androidMVP


        MVP架构集合点击查看

猜你喜欢

转载自blog.csdn.net/u014133119/article/details/80592475
今日推荐