• (未完成)【Android】MVP模式初见(一)


    最近在阅读郭霖大神的公众号时,分类中架构引起了我的注意。

    虽然是个人开发(水平很菜的那种),但最终都要向企业正式项目开发靠近。因此接下来一段时间,主要学习一下MVP架构、Retrofit以及RxJava

    本篇文章来自study_zhxu,博客地址:http://blog.csdn.net/study_zhxu

    本篇文章未完成,仅做学习记录


    MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
    在MVP模式中,Activity的功能就是响应生命周期和显示界面,具体其他工作都丢到了Presenter层中进行完成,Presenter其实是Model层和View层的桥梁。


    创建MVP步骤:
    1.创建IPresenter接口,把所有业务逻辑的接口都放在这里,并创建它的实现PresenterCompl(在这里可以方便查看业务逻辑功能,由于接口可以有多种实现所以也方便写单元测试)
    2.创建IView接口,把所有视图逻辑的接口都放在这里,其实现类是当前的Activity/Fragment
    3.Aactivity中只包含了一个IPresenter,而PresenterCompl里又包含了一个IView并且依赖了Model。Activity里只保留了IPresenter的调用,其他工作全部留到PresenterCompl中实现。
    4.Model并不是必须有的,但是一定会有View和Presenter。

    直接上例子:

    1.创建Presenter接口

    ILoginPresenter

    package com.paul.learningmvp.presenter;
    
    public interface ILoginPresenter {
        //清除输入框
        public void clear();
        //登录操作
        public void doLogin(String name,String password);
    }

    实现ILoginPresenteeer

    LoginPresenterCompl

    package com.paul.learningmvp.presenter;
    
    import com.paul.learningmvp.model.User;
    import com.paul.learningmvp.view.ILoginView;
    
    
    public class LoginPresenterCompl implements ILoginPresenter {
    
        private ILoginView loginView;
        private User user;
    
        public LoginPresenterCompl(ILoginView loginView) {
            this.loginView = loginView;
            user=new User("110","123456");
        }
    
        @Override
        public void clear() {
            loginView.onClearText();
        }
    
        @Override
        public void doLogin(String name, String password) {
            boolean result=false;
            int code=0;
            if(name.equals(user.getName())&&password.equals(user.getPassword())){
                result=true;
                code=1;
            }else {
                result=false;
                code=0;
            }
            loginView.onLoginResult(result,code);
        }
    }

    2.创建IView接口,所有对View的操作写在这里,和Presenter相关

    ILoginView

    package com.paul.learningmvp.view;
    
    public interface ILoginView {
        public void onClearText();
        public void onLoginResult(Boolean result,int code);
    }

    Activit是IView接口的实现类

    LoginActivity

    package com.paul.learningmvp.view;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import com.paul.learningmvp.R;
    import com.paul.learningmvp.presenter.ILoginPresenter;
    import com.paul.learningmvp.presenter.LoginPresenterCompl;
    import com.paul.learningmvp.view.ILoginView;
    
    public class LoginActivity extends AppCompatActivity
                                    implements ILoginView, View.OnClickListener {
    
        private Button mLogin;
        private Button mClear;
        private EditText mName;
        private EditText mPassword;
        ILoginPresenter loginPresenter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mLogin=findViewById(R.id.btn_confirm);
            mClear=findViewById(R.id.btn_clear);
            mName=findViewById(R.id.tv_name);
            mPassword=findViewById(R.id.tv_password);
    
            mLogin.setOnClickListener(this);
            mClear.setOnClickListener(this);
            loginPresenter=new LoginPresenterCompl(this);
        }
    
        @Override
        public void onClearText() {
            mName.setText("");
            mPassword.setText("");
            Toast.makeText(this,"clear",Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onLoginResult(Boolean result, int code) {
            mLogin.setEnabled(true);
            mClear.setEnabled(true);
            if(result){
                Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        public void onClick(View v) {
            String name=mName.getText().toString();
            String password=mPassword.getText().toString();
            switch (v.getId()){
                case R.id.btn_confirm:
                    loginPresenter.doLogin(name,password);
                    break;
                case R.id.btn_clear:
                    loginPresenter.clear();
                    break;
            }
        }
    }

    3.model

    User

    package com.paul.learningmvp.model;
    
    public class User {
        private String name;
        private String password;
    
        public User(String name, String password) {
            this.name = name;
            this.password = password;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
  • 相关阅读:
    Sqlserver 2008:sp_msforeachdb 坑爹的错误陷阱
    安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!
    Sqlserver 2008+:变更数据捕获(CDC) 和 更改跟踪(CT)
    PHP.ini 性能优化
    PHP Notice: Undefined index: ... 问题的解决方案
    查询类方法代码分析
    页面跳转方法总结大全
    如何关闭searchIndexer.exe进程
    如何正确运用PHP ini_set函数
    PHP中的串行化变量和序列化对象
  • 原文地址:https://www.cnblogs.com/robotpaul/p/11864927.html
Copyright © 2020-2023  润新知