MVP架构原理和实现

放肆的年华 提交于 2020-01-20 18:25:04

MVP架构介绍

Android开发三大框架,MVC,MVP,MVVM,简单介绍下其余两种

MVC

M(Model)是数据模型,或者数据处理,V(View)是视图控件,C(controller)是逻辑控制类,MVC是以前常用或者老式的项目用的比较多,优势和缺陷都相当明显,感觉并会没有彻底做到VC分离的效果
优势:除了model是独立的,V和C在Activity中体现最为明显,Activity即作为V,也作为C,处理逻辑业务和UI交互非常方便,都在一个Activity里面搞定。
缺陷:它的优势也是它的缺陷,过度集成在同一个Activity里面,耦合度也比较强,抽离的话也有可能涉及到引用持有问题,代码量和逻辑会越来越多,越来不清晰,日后想要维护或者新增功能,成本会很高。

MVVM

View: 对应于Activity和XML,负责View的绘制以及与用户交互。
Model: 实体模型。
ViewModel: 负责完成View与Model间的交互,负责业务逻辑。

MVVM目的也是为了彻底分离控件和数据的架构,它主要是依靠DataBinding进行数据绑定,作用就是讲数据和控件绑定起来,当数据进行改变的时候,会自动刷新View,由于本人没用过,所以没什么发言权

MVP

MVP架构是当前比较流行开发框架,相比于MVVM,我觉得相比就多了一个更新数据的步骤,但是MVP的实现是不需要依赖框架,也是优势之一,灵活。
原理:将数据M层获取数据,由P层进行完成MV业务逻辑交互和数据更新逻辑,然后将数据结果传递给V层进行UI数据更新和UI业务处理。
作用:将M层和V层彻底隔离出来,每个层只需要负责自己的逻辑,然后要交互其它层,就经过P层开放的接口去处理。达到代码分割效果。
缺点:一个功能模块可能就需要一个P类,一个成熟的MVP项目会需要创建很多很多的契约类和P层类,且P层的代码量也会越来越重,维护相比MVC来说还是好很多倍了。

刚说了MVP的好处就是不需要依赖框架,所以实现起来也有灵活,可以配合各种模式实现MVP

MVP例子:
1.先创建些基本的契约类,BaseView用于P层View的结果回调,BasePresenter用于对应P类的初始化。当然也创建一个具体模块的测试契约类

public interface BaseContact {
    interface BaseView {
        void onSuccess();
        void onFail();
    }

    interface BasePresenter<V>{
        void onCreatePresenter();
        void init(V view);
    }
}
public interface TestContact{
    interface View extends BaseContact.BaseView{
        void showSomething(String msg);
    }

    interface Presenter<T> extends BaseContact.BasePresenter<T>{
        void test(String msg);
    }
}

2.创建基础的P类 和 下层具体模块的P类

public class BasePresenter <V extends BaseContact.BaseView> implements BaseContact.BasePresenter<V> {

    public V mView;

    @Override
    public void onCreatePresenter() {

    }

    @Override
    public void init(V view) {
       this.mView = view;
    }


}
public class TestPresenter extends BasePresenter<TestContact.View> implements TestContact.Presenter<TestContact.View> {

    TestModel testModel;

    public TestPresenter() {
        testModel = new TestModel();
    }

    @Override
    public void test(final String msg) {
        testModel.test(msg, new TestCallBack() {
            @Override
            public void onSuccess() {
                mView.showSomething(msg);
            }

            @Override
            public void onError() {
                mView.showSomething("错误");
            }
        });
    }
}

3.采用注解+工厂的形式去创建下层具体的P类(重点)

/**
 * 生成presenter注解
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface OnCreateClass {
    Class<? extends BaseContact.BasePresenter> value();
}

4.创建P类的工厂,根据注解生成对应的P层对象

public class PresenterFactory {

    /**
     * 创建P层实例对象
     * @param object
     * @param <T>
     * @return
     */
    public static <T extends BaseContact.BasePresenter> T createPresenter(Object object){
        OnCreateClass annotation = object.getClass().getAnnotation(OnCreateClass.class);

        T mPresenter = null;

        if (annotation != null && annotation.value() instanceof Class){
            Class<T> classObject = (Class<T>) annotation.value();
            try {
                mPresenter  = classObject.newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        }

        return mPresenter;
    }
}

5.M层和V层的逻辑就更简单了,直接继承调用P的内容就可以完成交互,前提是要记得写上对应的P类注解,否则工厂无法生成对应的P对象

V层:

public class BaseActivity <V extends BaseContact.BaseView, P extends BaseContact.BasePresenter> extends AppCompatActivity implements BaseContact.BaseView {

    public P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = PresenterFactory.createPresenter(this);
        mPresenter.init( (V)this);
    }

    public P getPresenter(){
        return mPresenter;
    }

    @Override
    public void onSuccess() {

    }

    @Override
    public void onFail() {

    }
}

@OnCreateClass(TestPresenter.class)
public class TestClassTimeActivity extends BaseActivity<TestContact.View, TestContact.Presenter> implements TestContact.View {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvp);
        init();
    }

    private void init() {
        getPresenter().test("提示");
    }

    @Override
    public void showSomething(String Msg) {
        Toast.makeText(this, Msg, Toast.LENGTH_SHORT).show();
    }

}

M层:

/**
 * M层
 */
public class TestModel {

    public void test(String Msg, TestCallBack callBack){
        if (Msg != null){
            callBack.onSuccess();
        }else {
            callBack.onError();
        }
    }
}
public interface TestCallBack {
    void onSuccess();
    void onError();
}

就这样简单的搭建了一个基本的MVP架构,当然成熟的项目用MVP里面可能还需要继续封装多层,包括网络的,生命周期管理,配合其他模式一起使用,如代理模式,单例的等等,根据项目需要进行各种组合,这一点我觉得是很不错的。
无论怎么组合,M层和V层的交互都是有P层实现,在回调通知另一方
但整体原理和架构基本就是这样,采用注解+工厂的方式去创建P类,可以省下很多不必要的功夫,而且获取到的P类为空的概率风险也降低。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!