理解MVP——初次体验MVP模式开发

一、当年的MVC

参考:Android开发模式之MVC

  • 全称:Model-View-Controller
  • Model:数据处理部分
  • Controller:逻辑的处理
  • View:界面显示部分

二、什么是MVP?

参考:Android开发模式之MVP

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:

Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

  • 全称:Model-View-Presenter
  • Model:数据处理部分
  • Presenter:逻辑处理部分
  • View:界面显示部分

三、MVP与MVC的区别

作为一种新的模式,MVPMVC有着一个重大的区别:

MVPView并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller

所有一句话概括:ViewModel耦合性低,但也造成Presenter的逻辑增多

四、 MVP模式的优缺点

优点:

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

缺点:

  • 由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁
  • 如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。

五、简单示例

实现效果:

在EditText中输入数据,点击Button,在下面的TextView中显示处理后的结果 

设计流程: 

具体代码:

Model的代码: IUserService.java(接口)

public interface IUserService {
    //进行查询(数据处理)
    String search(int hashCode);
}
UserService.java (实现类)
public class UserService implements IUserService {

    @Override
    public String search(int hashcode) {
        return "User:" + hashcode;
    }
}

View代码:

IView.java(接口)这里我们把MainActivity当成View

public interface IView {
    //得到输入
    String getInputString();

    //设置输出
    void setResultString(String s);
}

Presenter代码:

IPresenter.java

public interface IPresenter {
    //逻辑处理(集中处理View和Model的方法)
    void logic();
}

Presenter.java(实现类)在logic方法中具体实现View和Model层的方法

public class Presenter implements IPresenter {

    private IView mView;

    //构造,绑定View
    public Presenter(IView view) {
        mView = view;
    }

    @Override
    public void logic() {
        //通过View 获取到数据
        String inputString = mView.getInputString();
        //判空
        if (TextUtils.isEmpty(inputString)) {
            //为空直接返回..
            return;
        }
        //拿到数据对应的hashCode值
        int hashCode = inputString.hashCode();
        //创建一个IUserService的实例 注意是接口 隐藏具体方法的实现
        IUserService service = new UserService();
        //通过Model的IUserService的实例进行数据处理(就是进行查询)
        String serviceResult = service.search(hashCode);
        String result = "Result:" + inputString + "-" + serviceResult;
        //View显示返回的结果
        mView.setResultString(result);
    }
}

MainActivity.java 这是实现了IView接口,即当前Activity是当中做View层 来看待

/这里把当前Activity当中View
public class MainActivity extends Activity implements IView {

    @BindView(R.id.txt_result)
    TextView mResultText;
    @BindView(R.id.edit_test)
    EditText mInputText;


    @Override
    protected int getContentLayoutId() {
        return R.layout.activity_main;
    }

    //都是用接口,不会用具体的实现Presenter
    private IPresenter mPresenter;

    //这里是基类的一个重写的方法
    @Override
    protected void initData() {
        super.initData();
        mPresenter = new Presenter(this);
    }


    //点击Submit触发
    @OnClick(R.id.btn_submit)
    void onSubmit() {
        mPresenter.logic();
    }

    @Override
    public String getInputString() {
        return mInputText.getText().toString();
    }

    @Override
    public void setResultString(String s) {
        mResultText.setText(s);
    }
}

简单的MVP设计模式完成。

六、深入了解:

Google官方图:

转:我理解的MVC/MVP

转:Google官方MVP Sample代码解读

猜你喜欢

转载自blog.csdn.net/qq_17846019/article/details/85384527
MVP