Android--谷歌MVP代码分析<简单源码>

来源:互联网 发布:涉黄网络犯罪 编辑:程序博客网 时间:2024/05/21 04:43

资料来源:https://github.com/konmik/konmik.github.io/wiki/Introduction-to-Model-View-Presenter-on-Android

MVP:
View 对应于Activity,负责View的绘制以及显示数据并对用户行为做出反应的层;
Model 数据访问层<数据库,远程服务器>,JavaBean;
Presenter 数据处理层,负责完成View于Model间的交互,完成数据以及业务逻辑的处理;

可以理解为:减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到了Presenter中进行处理。对应的好处:耦合度更低,更方便的进行测试

MVC:
这里写图片描述

MVP:
这里写图片描述

结合谷歌官方例子,简化一个MVP:

–1:先看两个Base

public interface BaseView<T> {    void setPresenter(T presenter);}public interface BasePresenter {    void start();}

start()方法可以放初始化类的方法,或者,可以拿来进行类初始化后的事件处理,网络请求
–2:契约类:
—– View是UI操作
—–Presenter 是数据业务逻辑操作

public interface UserContract {    interface View extends BaseView<Presenter> {        UserModel getUser();    }    interface Presenter extends BasePresenter {        void showUser();    }}

–3:Presenter:
——构造函数:
MainActivityPresenter的构造函数,参数为UserContract.View,并调用view.setPresenter();
MainActivityPresenter

public class MainActivityPresenter implements UserContract.Presenter {    private Context context;    private UserContract.View view;    public MainActivityPresenter(Context context, UserContract.View view) {        this.context = context;        this.view = view;        view.setPresenter(this);    }    @Override    public void showUser() {        getShowUser();    }    @Override    public void start() {    }    private void getShowUser() {        UserModel userModel = view.getUser();        Toast.makeText(context, "user" + userModel.getName() + userModel.getPassword(), Toast.LENGTH_LONG).show();    }}

–4:Modle:
—-JavaBean<实体类>

public class UserModel {    private String name;    private String password;    public UserModel(String name, String password) {        this.name = name;        this.password = password;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

–5:View:
——对应的Activity或者Fragment:
——new MainActivityPresenter();—-初始化对象
——presenter.start();—-调用初始化方法
——setPresenter();

public class MainActivity extends AppCompatActivity implements UserContract.View {    private UserContract.Presenter presenter;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        new MainActivityPresenter(this,this);        presenter.start();        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                presenter.showUser();            }        });    }    @Override    public UserModel getUser() {        UserModel userModel = new UserModel("erhu", "key");        return userModel;    }    @Override    public void setPresenter(UserContract.Presenter presenter) {        this.presenter=presenter;    }}

注意:
在onCreate()中:

new MainActivityPresenter();

而并没有像写成<两者都可以>:

presenter=new MainActivityPresenter();

是因为在MainActivityPresenter的构造方法里面调用了view.setPresenter(),相当于间接初始化了相关数据。

0 0