美文网首页Android架构模式设计
Android架构设计---MVP模式探讨

Android架构设计---MVP模式探讨

作者: ZebraWei | 来源:发表于2018-01-07 23:18 被阅读16次

    **版权声明:本文为小斑马伟原创文章,转载请注明出处!


    MVP架构:全名Model View Presenter,Presenter处理逻辑业务,Model提供数据,View更新展示界面。完全隔离页面显示于业务逻辑,不论更改界面或者更改业务逻辑均为单方面更改。Presenter负责业务逻辑 。
    一、MCP的sanceng
    • a、View: 视图层,对应xml文件与Activity/Fragment;
    • b、Presenter: 逻辑控制层,同时持有View和Model对象;
    • c、Model: 实体层,负责获取实体数据。
    二、MVP对比MVC分析

    MVC:Model用于处理数据,业务逻辑等等,若数据发生变化直接通知View进行改变。View处理UI的显示,动效等等。Controller控制Model的请求并且获得View的数据返回显示,作为View于Model的桥梁分离业务逻辑于UI显示。
    MVP:Presenter负责业务逻辑。Model于View完全隔离。Presenter可多次重用,便于业务逻辑的测试。缺点:开发效率地下(时间上),接口类过多 Presenter于View需要接口交互,接口类过多View层通用接口需要在BaseActivity处理 重用逻辑需要对Presenter抽象处理。
    总之:MVC架构:优点-理解容易,快速上手,使用简单。缺点-Activity逻辑与UI过重将 导致迭代维护不变。MVP架构:优点-View于Model完全隔离,Presenter可重用便于测试。缺点-View层过重,需要在Base抽象通用View,接口类过多,开发耗时。

    三、Model设计分析

    根据业务书写Model层数据以及业务。数据:用户名、密码。业务逻辑:登陆。
    登录逻辑接口

    public interface UserLogicModel {
    
        void login(String account,String password,UserLoginListener userLoginListener);
    
    }
    

    登录成功或者失败回调的接口

    public interface UserLoginListener {
        void LoginSuccess();
    
        void LogicFailed();
    }
    

    登录接口的实现

    public class UserLoginModelImpl implements  UserLogicModel {
    
    @Override
    public void login(final String account, final String password, final UserLoginListener userLoginListener) {
          //这里是处理登陆的业务逻辑
        Log.d("logic","登录中");
        new Handler().postDelayed(new Runnable(){
    
            @Override
            public void run() {
                if("weiwei".equals(account) && "123".equals(password)) {
                    userLoginListener.LoginSuccess();
                } else {
                    userLoginListener.LogicFailed();
                }
            }
        },3000);
    }
    }
    
    四、View设计分析

    View根据返回结果做出相应显示以及动果,Presenter需要接口于View交互。
    Presenter于View交互的接口

    public interface LoginView {
        void showLoading();
    
        void hideLoading();
    
        void success();
    
        void failed();
    
        void clear();
    }
    

    View界面的展示反馈

    public class MainActivity extends AppCompatActivity implements View.OnClickListener,LoginView {
        private EditText editAccount;
        private EditText editPassWord;
        private AppCompatButton btnLogin;
        private AppCompatButton btnClear;
        private ProgressDialog progressDialog;
        private LoginPresenter loginPresenter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
    }
    
    private void initListener() {
        btnLogin.setOnClickListener(this);
        btnClear.setOnClickListener(this);
    }
    
    private void initView() {
        loginPresenter = new LoginPresenter(this,this);
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("login process,Watting...");
        progressDialog.setCancelable(false);
        editAccount = (EditText)findViewById(R.id.edit_account);
        editPassWord = (EditText)findViewById(R.id.edit_password);
        btnLogin = (AppCompatButton)findViewById(R.id.btn_login);
        btnClear = (AppCompatButton)findViewById(R.id.btn_delete);
    }
    
    
    @Override
    public void onClick(View view) {
        switch(view.getId()) {
            case R.id.btn_login:
                loginPresenter.login(editAccount.getText().toString(),editPassWord.getText().toString());
                break;
            case R.id.btn_delete:
                clear();
                break;
        }
    }
    
    /**
     * Presenter层执行完返回的结果
     */
    @Override
    public void showLoading() {
         progressDialog.show();
    }
    
    @Override
    public void hideLoading() {
        progressDialog.dismiss();
    }
    
    @Override
    public void success() {
        Toast.makeText(this,"login success",Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void failed() {
        Toast.makeText(this,"login fail",Toast.LENGTH_SHORT).show();
    }
    
    @Override
    public void clear() {
        editAccount.setText("");
        editPassWord.setText("");
    }
    }
    
    四、Presenter设计分析

    Presenter业务逻辑的控制与View展示桥梁。

    public class LoginPresenter {
    
    private LoginView mLoginView;
    private UserLoginModel userLoginModel;
    private Context mContext;
    
    public LoginPresenter(Context context,LoginView mLoginView) {
        this.mContext = context;
        this.mLoginView = mLoginView;
        userLoginModel = new UserLoginModelImpl();
    }
    
    public void login(String userName,String password) {
        mLoginView.showLoading();
        if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password)) {
            Toast.makeText(mContext,"please input userName and userPassword",Toast.LENGTH_SHORT).show();
        } else {
            mLoginView.showLoading();
            userLoginModel.login(userName, password, new UserLoginListener() {
                @Override
                public void loginSuccess() {
                    mLoginView.success();
                    mLoginView.hideLoading();
                }
    
                @Override
                public void loginFail() {
                    mLoginView.failed();
                    mLoginView.hideLoading();
                }
            });
        }
      }
    }
    

    基础MVP架构View于Model缺点:Activity中每遇到一个不同业务需求实例Presenter,并且实现View的接口,代码繁琐复杂不够简洁。接下来会在下一篇实现一步注册Presenter绑定View与Model业务逻辑移植到Presenter。

    相关文章

      网友评论

        本文标题:Android架构设计---MVP模式探讨

        本文链接:https://www.haomeiwen.com/subject/gwwmnxtx.html