MVP在Android中的应用

传统的Android项目基本上都是基于MVC模式,基于MVC但是有没有彻底的遵循MVC的模式规则,基本上是MVC模式的混乱版。在实际项目中运用设计模式主要是为了降低程序的耦合度,增加项目功能的可维护度。而大多数的Android项目都没能够比较好的做到模型、数据、控制器的分离,也就是说没有实现低耦合,没有实现功能的单一性。很多人在设计代码的时候出现小的或者大的上帝类、全能类的情况。因此MVP模式的运用很好的实现了模型、数据、控制器的分离,大大的提高的项目的性能以及可维护性。这里主要讲解一下MVPAndroid项目中的应用。

MVCMVP有什么区别

毋庸置疑,MVC所代表的含义就是ModelViewControl;在Android中,基于MVC设计的模式中,Layout充当着View角色,Activity充当着Control的角色,其他数据结构类以及辅助类充当Model角色。充当的本质却并没有实现三个层次的分离与解耦。现实的代码结构中Activity并没有真正意义上充当Conrtol角色,很像是Model/View/Contrl的结合体,Activity中同事拥有这View以及model的对象引用,一些逻辑功能也是通过Activity来实现,ModelView的交互大多数也是在Activity中实现的。这就造成Activity违背了Control的职责,从而造成Activity功能复杂,耦合度高,成为一个比较纷杂的小型上帝类。

所谓的MVP即是指ModelViewPresenter,相比较MVC的三个层次划分的不清晰而言,MVP在层次的划分上显得更加彻底了。

没图没真相,请各位看官赏图。


如图所示在MVC模式下的Android结构图中,很清晰的看出在MVC模式中是允许ModelView进行交互的,这二者没有实现彻底的分离。而在MVP的模式中并没有存在ModelView的交互,所有的交互功能都是通过Presenter来出传达,Presenter更像连接ModelView的纽带。从而实现指令式的逻辑,即:

ViewPresenter说“我想干什么,你看着办。我需要什么数据,你看着取”。

PresenterModel说“给我去做什么什么事情,给我什么什么数据”。

Presenter拿到数据后和View“事情做完了,你想继续做什么,数据拿到了给你拿去用吧”。

从而更加清晰的结构层次,View负责数据到页面的渲染,Presenter负责数据逻辑的支配,Model负责数据和逻辑的实现。View的渲染通过接口完成。

  简略的说了一下,还是上代码比较靠谱,各位不要着急,代码来也。

                                                     

本次值介绍一下简单的登陆页面的实现。在此功能中,Model—LoginMode,View—LoginView,Presenter—LoginPresenter。

public class LoginModel {

    @Override
    public void load(String username,String passWord,LoadListener loadListener) {
        //实现登陆逻辑

    }
    public interface LoadListener {
        void onSuccess();//登陆成功后回调
        void onFailure(int errorNo,String strMsg);//登陆失败后回调
    }

LoginModel 主要实现登陆逻辑的实现,其中有一个内部接口LoginListener执行登陆结果的回调,此接口在LoginPresenter中实现。

public class LoginPresenter implements BasePresenter {

    LoginView mLoginView;
    LoginModel mLoginModel;

    public LoginPresenter(LoginView mLoginView) {
        this.mLoginView = mLoginView;
        mLoginModel = new LoginModelImpl();
    }

    @Override
    public void loadData() {
        mLoginView.showLoadProgressbar();
        String username = mLoginView.getLoginName();
        String passWord = mLoginView.getPassWord();
        mLoginModel.load(username,passWord,new LoginModelImpl.LoadListener() {
            @Override
            public void onSuccess() {
                mLoginView.hindLoadProgressbar();
                mLoginView.showNotication("登陆成功");
            }

            @Override
            public void onFailure(int errorNo, String strMsg) {
                mLoginView.hindLoadProgressbar();
                mLoginView.showNotication(strMsg);
            }
        });
    }
}
LoginListener创建Model对象调取登陆方法,实现登陆model中的监听接口。

public interface LoginView {
    String getLoginName();

    String getPassWord();

    void showLoadProgressbar();
    void hindLoadProgressbar();

    void showNotication(String message);
    void loginSuccess();
}
VIew接口,此接口又在LoginActivity中实现,在LoginPresenter中回调。

public class LoginActivity extends BaseActivity implements LoginView{
@Override
public void hindLoadProgressbar() {
    mdLoadingDialog.hide();

}

@Override
public void showLoadProgressbar() {
    mdLoadingDialog.show();
}

@Override
public void showNotication(String message) {

    KJLoger.debugLog(Tag,message);
}

@Override
public void loginSuccess() {

}
}





 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值