• <Android 基础(三)> MVP模式


    前言

    MVP,这里指的并不是篮球比赛中的MVP(最有价值球员),而是一种代码框架和设计思想,它是由MVC演变而来的。
    MVP模式(Model-View-Presenter)
    是MVC模式的一个衍生。主要目的是为了解耦,使项目易于维护。
    Model 是业务逻辑和实体模型
    View 是包含Presenter的引用。所要做的就是当有交互时,调用Presenter里的对应方法。通常会通过Activity实现
    Presenter 是负责完成View于Model间的交互,从Model里取数据,返回给View处理好的数据。

    这里写图片描述

    MVC模式(Model-View-Controller)
    主要目的是讲显示逻辑和业务逻辑独立出来
    Model 是应用程序中用于处理应用程序数据逻辑的部分。
    View 是应用程序中处理数据显示的部分。
    Controller 是应用程序中处理用户交互的部分

    这里写图片描述

    从构造图上可以看到最主要的差异就是

    MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的

    MVP使用方法

    代码结构
    这里写图片描述

    代码内容
    LoginActivity.java

    public class LoginActivity extends AppCompatActivity implements ILoginView {
    
        @Bind(R.id.usernameWrapper)
        TextInputLayout usernameWrapper;
        @Bind(R.id.passwordWrapper)
        TextInputLayout passwordWrapper;
        @Bind(R.id.bt_clear)
        Button btClear;
        @Bind(R.id.bt_login)
        Button btLogin;
    
        private LoginPresenterCompl loginPresenterCompl;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            ButterKnife.bind(this);
    
            loginPresenterCompl = new LoginPresenterCompl(this);
    
    
        }
    
        @OnClick({R.id.bt_clear, R.id.bt_login})
        public void onClick(View view) {
            String username = usernameWrapper.getEditText().getText().toString();
            String password = passwordWrapper.getEditText().getText().toString();
    
            switch (view.getId()) {
                case R.id.bt_clear:
                    loginPresenterCompl.clearText();
                    break;
                case R.id.bt_login:
                    loginPresenterCompl.doLogin(username, password);
                    break;
            }
        }
    
        @Override
        public void onLoginResult(boolean isLogged) {
            if (isLogged) {
                Toast.makeText(this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Logged Failed", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    
        @Override
        public void onClearText() {
            usernameWrapper.getEditText().setText("");
            passwordWrapper.getEditText().setText("");
            usernameWrapper.clearFocus();
            passwordWrapper.clearFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(),
                        0);
            }
        }
    }

    LoginActivity实现ILoginView接口

    public interface ILoginView {
        void onLoginResult(boolean isLogged);
        void onClearText();
    }
    

    LoginPresenterCompl.java实现ILoginPresenter接口

    public class LoginPresenterCompl implements ILoginPresenter{
    
        private ILoginView iLoginView;
        Handler handler;
    
    
        public LoginPresenterCompl(ILoginView loginView) {
            iLoginView = loginView;
            handler = new Handler(Looper.getMainLooper());
        }
    
    
    
        @Override
        public void doLogin(String username, String password) {
            final String tp_username =  username;
            final String tp_password =  password;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    boolean isLogged = false ;
                    if(UserModel.isValidUser(tp_username , tp_password)) {
                        isLogged = true;
                    }
                    final boolean tp_isLogged = isLogged;
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            iLoginView.onLoginResult(tp_isLogged);
                        }
                    });
    
                }
            }).start();
    
        }
    
        @Override
        public void clearText() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            iLoginView.onClearText();
                        }
                    });
    
                }
            }).start();
    
        }
    }
    public interface ILoginPresenter {
        void doLogin(String username, String password);
        void clearText();
    }
    

    UserModel.java这个没有怎么使用,但是实际使用过程中不同的Model会有不同的处理方式

    public class UserModel {
        public String username;
        public String password;
    
        public UserModel(String username, String password) {
            this.username = username;
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public static boolean isValidUser(String username, String password){
            return (username.equals("guagua") && password.equals("guagua"));
        }
    }

    简约类图:
    这里写图片描述

    效果图

    这里写图片描述 这里写图片描述

  • 相关阅读:
    RT-SA-2019-005 Cisco RV320 Command Injection Retrieval
    RT-SA-2019-003 Cisco RV320 Unauthenticated Configuration Export
    RT-SA-2019-004 Cisco RV320 Unauthenticated Diagnostic DataRetrieval
    RT-SA-2019-007 Code Execution via Insecure Shell Functiongetopt_simple
    APPLE-SA-2019-3-25-1 iOS 12.2
    APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows
    APPLE-SA-2019-3-25-6 iCloud for Windows 7.11
    APPLE-SA-2019-3-25-4 Safari 12.1
    Mybatis下的sql注入
    java代码审计中的一些常见漏洞及其特征函数
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467203.html
Copyright © 2020-2023  润新知