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里面实现,那么类的代码量将会变得很大,当代码量超过一千行时,代码的阅读就会变得非常困难。
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- MVP模式
- mvp模式
- MVP模式
- mvp模式
- MVP模式
- MVP模式
- mvp模式
- MVP模式
- mvp模式
- MVP模式
- mvp模式
- MVP模式
- 单例模式
- SpringMVC文件上传(转载)
- HDU 5974
- 杭电 Is It A Tree? 并查集 有向图是否为树
- 文件拷贝-上传文件
- mvp模式
- 有道云markdown编辑代码前后高亮
- h5中使用canvas绘制线段、多边形、圆、圆弧
- log4j配置优化
- selenium+testng+gitblit+jenkins+ant自动化测试系列十:Jenkins配置自动化持续集成构建
- jsp taglib问题
- 报数游戏-(容斥+二分)
- python初学的笔记
- 图像检索服务器编写问题记录——回忆历次版本更改