mvp模式

来源:互联网 发布:英语四级真题软件 编辑:程序博客网 时间:2024/05/20 03:07

mvp模式

mvp就是model-view-presenter。
如下图所示为mvp的结构图,其中model提供数据,view负责显示,presenter负责逻辑处理。使用mvp模式,可以很好的降低耦合,使得代码结构清晰,方便修改。
这里写图片描述

mvp和mvc的区别

mvp模式是由mvc模式转变而来,他们的对比结构图如下所示。左边是mvp模式,右边是mvc模式。
在mvc模式当中,view依赖于model模块和controller模块,而在mvp模式当中,view只依赖于presenter模块,这样做的好处就是,数据和视图完全分离,当其中一方发生改变时,另外一方完全不受影响,有利于代码的复用和测试。
这里写图片描述

例子

举个例子说明如何实现mvc模式,以登录功能为例,如下图所示,输入用户名和密码,点击登录,验证用户名和密码是否通过。
这里写图片描述

代码结构

整体的代码结构如下图所示,
其中model模块包含User和UserModel,User是基础类,包含用户名和密码,UserModel提供了验证查询、验证等功能;
presenter模块包含IloginPresenter和Presenter,登录的逻辑处理;
view模块ILoginView和MainActivity,登录的视图。
这里写图片描述

model模块

User类,包含有用户名和密码。

public class User {    private String userName;    private String password;    public User(){    }    public User(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;    }}

UserModel类,模拟从数据库当中读取用户以及登录用户验证的功能。使用单例模式实现。

public class UserModel {    private List<User> userlist;    private UserModel(){        userlist = new ArrayList<>();        getAllUserFromData();    }    private static UserModel model;    public static UserModel getInstance(){        if(model == null){            model = new UserModel();        }        return model;    }    public void save(User user){        userlist.add(user);    }    public void remove(User user){        userlist.remove(user);    }    //模拟从数据库当中读取用户    public void getAllUserFromData(){        userlist.add(new User("张三","123"));    }    //模拟登录验证    public boolean checkUser(String username,String password){        boolean result = false;        for(User user : userlist){            if(user.getUserName().equals(username)&&user.getPassword().equals(password)){                result = true;                break;            }        }        return result;    }}

presenter模块

ILoginPresenter接口

public interface ILoginPresenter {    void clear();//清空用户名和密码    void doLogin(String name, String passwd);//登录}

Presenter实现了ILoginPresenter接口,包含有LoginView和UserModel。

public class Presenter implements ILoginPresenter{    private ILoginView loginView;    private UserModel userModel;    public Presenter(ILoginView loginView){        this.loginView = loginView;        userModel = UserModel.getInstance();    }    @Override    public void clear() {        loginView.onClearText();    }    @Override    public void doLogin(String name, String passwd) {        if(userModel.checkUser(name,passwd)){//登录成功            loginView.onLoginResult(true,1);        }else{//登录失败            loginView.onLoginResult(false,0);        }    }}

view模块

ILoginView接口

public interface ILoginView {    public void onClearText();//清空用户名和密码    public void onLoginResult(Boolean result, int code);//登录结果}

MainActivity实现了ILoginView接口,包含ILoginPresenter接口。本身只关注与界面的实现,而将逻辑处理交给presenter。

public class MainActivity extends AppCompatActivity implements ILoginView , View.OnClickListener{    private EditText edit_username;    private EditText edit_pwd;    private Button btn_login;    private ILoginPresenter presenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        edit_username = (EditText) findViewById(R.id.edit_username);        edit_pwd = (EditText) findViewById(R.id.edit_pwd);        btn_login = (Button) findViewById(R.id.btn_login);        btn_login.setOnClickListener(this);        presenter = new Presenter(this);    }    @Override    public void onClearText() {        edit_username.setText("");        edit_pwd.setText("");    }    @Override    public void onLoginResult(Boolean result, int code) {        if(result == true){            Toast.makeText(this,"登陆成功!",Toast.LENGTH_SHORT).show();            this.onClearText();        }else{            Toast.makeText(this,"登陆失败!",Toast.LENGTH_SHORT).show();        }    }    @Override    public void onClick(View v) {        if(v == btn_login){            String userName = edit_username.getText().toString();            String pwd = edit_pwd.getText().toString();            presenter.doLogin(userName,pwd);        }    }}

总结

从上面的例子可以看出,使用mvp模式,可以使得代码的结构很清晰。
MainActivity只需要关注与界面的变化就可以了,从而使得类的代码量变少。
如果逻辑处理都在MainActivity里面实现,那么类的代码量将会变得很大,当代码量超过一千行时,代码的阅读就会变得非常困难。

0 0
原创粉丝点击