Android中的MVC和MVP

一、什么是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{

    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 {
    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 {
    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 {
    void login(T t);
}

github项目地址

 

你可能感兴趣的:(android技术)