<Android 基础(三)> MVP模式

来源:互联网 发布:服务器同步软件 编辑:程序博客网 时间:2024/05/02 02:51

前言

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"));    }}

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

效果图

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

1 0
原创粉丝点击