zoukankan      html  css  js  c++  java
  • MVP模型

    MVP模型一般要创建三个文件夹:View、Interactor(Model)、Presenter

    每个部分都有其接口和实现类,就是为了方便回调

    这里做一个登陆界面为例子:

     接口:

    InteractorInterface:
    public interface LoginInteractor {
        void login(String userName,String password,OnLoginFinishedListener listener);
    }
    PresenterInterface
    public interface LoginPresenter {
        void validateCredentials(String userName,String password);
        void onDestroy();
    }
    public interface OnLoginFinishedListener {
        void onUserNameError();
        void onPasswordError();
        void onSuccess();
    }
    ViewInterface
    public interface LoginView {
        void setUserNameError();
        void setPasswordError();
        void navigateToHome();
    }

    实现类:

    InteractorImpl
    public class LoginInteractorImpl implements LoginInteractor {
        @Override
        public void login(final String userName, final String password, final OnLoginFinishedListener listener) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Log.i("ZhiXueHui", "LoginInteractorImpl-login");
                    boolean error = false;
                    if(TextUtils.isEmpty(userName)){
                        listener.onUserNameError();
                        error = true;
                    }
                    if(TextUtils.isEmpty(password)){
                        listener.onPasswordError();
                        error = true;
                    }
                    if(!error){
                        listener.onSuccess();
                    }
                }
            },2000);
        }
    }
    PresenterImpl
    public class LoginPresenterImpl implements LoginPresenter,OnLoginFinishedListener {
        private LoginView loginView;
        private LoginInteractor loginInteractor;
    
        public LoginPresenterImpl(LoginView loginView){
            this.loginView = loginView;
            this.loginInteractor = new LoginInteractorImpl();
        }
    
        @Override
        public void validateCredentials(String userName, String password) {
            Log.i("ZhiXueHui", "LoginPresenterImpl-validateCredentials");
            loginInteractor.login(userName,password,this);
        }
    
    
        @Override
        public void onDestroy() {
            Log.i("ZhiXueHui", "LoginPresenterImpl-onDestroy");
            loginView = null;
        }
    
        @Override
        public void onUserNameError() {
            Log.i("ZhiXueHui", "LoginPresenterImpl-onUserNameError");
            if(loginView!=null){
                loginView.setUserNameError();
            }
        }
    
        @Override
        public void onPasswordError() {
            Log.i("ZhiXueHui", "LoginPresenterImpl-onPasswordError");
            if(loginView!=null){
                loginView.setPasswordError();
            }
        }
    
        @Override
        public void onSuccess() {
            Log.i("ZhiXueHui", "LoginPresenterImpl-onSuccess");
            if(loginView!=null){
                loginView.navigateToHome();
            }
        }
    }
    ViewActivity
    public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
    
        private EditText userName;
        private EditText password;
        private Button button;
        private LoginPresenter presenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            Log.i("ZhiXueHui", "LoginActivity-onCreate");
            userName = (EditText) findViewById(R.id.userName);
            password = (EditText) findViewById(R.id.password);
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(this);
    
            presenter = new LoginPresenterImpl(this);
        }
    
        @Override
        public void setUserNameError() {
            Log.i("ZhiXueHui", "LoginActivity-setUserNameError");
            userName.setError(getString(R.string.username_error));
        }
    
        @Override
        public void setPasswordError() {
            Log.i("ZhiXueHui", "LoginActivity-setPasswordError");
            password.setError(getString(R.string.password_error));
        }
    
        @Override
        public void navigateToHome() {
            Log.i("ZhiXueHui", "LoginActivity-navigateToHome");
            startActivity(new Intent(this, MainActivity.class));
            finish();
        }
    
        @Override
        public void onClick(View v) {
            Log.i("ZhiXueHui", "LoginActivity-onClick");
            presenter.validateCredentials(userName.getText().toString(),password.getText().toString());
        }
    }

    流程图:

    流程解释:

    第一步:View的实现类调用Presenter的接口

    第二步:Presenter的实现类调用Model的接口

    第三步:Model的实现类回调Presenter的接口

    第四步:Presenter的实现类回调View的接口

    一个循环下来,正好是View->Presenter->Model->Presenter->View。

    其中要注意的是,Presenter作为中转,分别对接View的实现类和Model的实现类,所以必须要建立两个接口

  • 相关阅读:
    Redis 锁
    Redis 持久化
    Redis 数据淘汰策略
    Redis 事务命令
    【vue禁止复制粘贴】
    tsconfig.json无法写入webpack.config.js 因为它会覆盖输入文件。
    npm 进阶命令知多少(一)
    如何将360度评估调查应用于员工发展?
    如何利用360度评估做好民主评议促进干部管理与选拔?
    手把手带你使用360度评估系统实施绩效反馈全流程(附详细图文)
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5697675.html
Copyright © 2011-2022 走看看