Android中的MVC和MVP

来源:互联网 发布:淘宝店铺装修素材图 编辑:程序博客网 时间:2024/06/10 09:11

一、什么是mvc和mvp

mvc:mvc就是model,view,controller。Android中modle毫无疑问大家都知道的就是数据实体了,view就是视图组件比如listview,viewpager等等。Controller控制器,view和modle交互由controller处理,由activity充当controller角色。

mvp:modle,view,presenter。同mvc开发模式一样modle就是数据实体,view是activity,presenter是自定义主导器,modle和view的交互由它来实现。

 

二、区别和优缺点

两者区别

Mvc开发模式的controller由activity充当,实际activity除了处理modle和view交互以外还处理视图初始化工作,因此它的功能并不单一。如果业务逻辑十分复杂的情况下会导致activity变的很臃肿和不易维护。

Mvp 开发模式activity作为view通过presenter中间者来实现与modle交互,很好的实现了解耦和,大大加强了项目扩展性和易维护性。


优缺点

Mvc与mvp相比不需要创建中间者presenter,会减少很多接口文件,对于功能简单的项目来说比较适合,快速敏捷。但是对于大型项目,业务和功能都十分复杂,mvc的维护性,扩展性,甚至代码易读性就会显得很差。

综合来说,还是推荐使用mvp开发模式,当然就像前面提到的功能简单的小项目可以采用mvc更快速的去开发一个项目。


三、代码演示

因为我们开发使用mvc已经非常熟练了,所以这里主要展示mvp开发。

比如我们要实现一个登录功能,需要有登录页面

mvp代码基本编写流程:

1.      编写view也就是Activity

注:通常继承于BaseActivity实现IBaseView(定义通用属性行为)

2.      根据view相关业务定义接口并使其实现

注:因为presetner处理m与v交互,所以持有的引用类型就是这里的接口类型。

3.      定义present

注:通常会定义一个抽象basepresenter定义通用属性行为,生命周期方法。

4.     将view业务接口类型引用和model引用交给presenter实现交互。


LoginActivity.java

public class LoginActivity extends BaseActivity implements View.OnClickListener ,ILoginView<String>{    private Button mLoginBtn;    private LoginPresenter mLoginPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentLayout(R.layout.activity_main);    }    @Override    public void getViews() {        mLoginBtn = (Button) findViewById(R.id.btn_login);    }    @Override    public void bindData() {    }    @Override    public void setListeners() {        mLoginBtn.setOnClickListener(this);    }    @Override    public void showToast(String msg) {        Toast.makeText(this,msg,Toast.LENGTH_LONG).show();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_login:                showLoadingLayout();                mLoginPresenter.login();                break;        }    }    @Override    public BasePresenter getPresenter() {        if(mLoginPresenter==null) {            mLoginPresenter = new LoginPresenter(this,this,this);        }        return mLoginPresenter;    }    @Override    protected void onDestroy() {        super.onDestroy();        mLoginPresenter.onDestroy();    }    @Override    public void login(String msg) {        showToast(msg);    }}


model和view需要通过presenter实现交互。因此Presenter需要持有model和view的引用,为了更好的服用和扩展,presenter和activity都定义了抽象父类,baseactivity实现了IbaseView接口定义通用的行为,loginActivity实现了ILoginView接口定义了View具体的业务属性。


  LoginPresenter

   public class LoginPresenter extends BasePresenter<IBaseView> {    public static final String LOGIN_TAG = "login_tag";    private final ILoginView mLoginView;    public LoginPresenter(Context context, IBaseView callbackView, ILoginView loginView) {        super(context,callbackView);        this.mLoginView = loginView;    }    public void login() {        // 模拟延时操作        new Thread() {            @Override            public void run() {                try {                    Thread.sleep(2000);                    EventBus.getDefault().post("登录成功");                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }.start();    }    @Subscribe(threadMode = ThreadMode.MAIN)    public void onLogin(String msg) {        mLoginView.login(msg);        mViewCallBack.hideLoadingLayout();    }    @Override    public void onCreate() {        EventBus.getDefault().register(this);    }    @Override    public void onDestroy() {        mViewCallBack = null;        EventBus.getDefault().unregister(this);    }}

BaseActivity

public abstract class BaseActivity extends AppCompatActivity implements IBaseView {    private FrameLayout mParentLayout;    private ProgressBar mLoadingPb;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.base_layout);        initViews();        if(null!=getPresenter()) {            getPresenter().onCreate();        }    }    @Override    public void initViews() {        mParentLayout = (FrameLayout) findViewById(R.id.fl_content);        mLoadingPb = (ProgressBar) findViewById(R.id.pb_loading);    }    @Override    public void setContentLayout(int resId) {        View.inflate(this,resId,mParentLayout);        getViews();        bindData();        setListeners();    }    @Override    public void showLoadingLayout() {        mLoadingPb.setVisibility(View.VISIBLE);    }    @Override    public void hideLoadingLayout() {        mLoadingPb.setVisibility(View.GONE);    }    public abstract BasePresenter getPresenter();    public abstract void getViews();    public abstract void bindData();    public abstract void setListeners();    @Override    protected void onDestroy() {        super.onDestroy();        if(null!=getPresenter()) {            getPresenter().onDestroy();        }    }}


BasePresenter

public abstract class BasePresenter<V extends IBaseView> {    protected Context mContext;    protected V mViewCallBack;    public BasePresenter(Context context,V viewCallBack) {        this.mContext = context;        this.mViewCallBack = viewCallBack;        initModel();//        onCreate();    }    public void initModel() {}    public abstract void onCreate();    public abstract void onDestroy();}


IBaseView 定义BaseActivity通用属性行为

public interface IBaseView {    void initViews();    void setContentLayout(int resId);    void showToast(String msg);    void showLoadingLayout();    void hideLoadingLayout();}

ILoginView 定义了LoginActivity基本业务属性。

public interface ILoginView<T> {    void login(T t);}

github项目地址

 

0 0
原创粉丝点击