版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq952290156/article/details/52767546
注:此blog只为学习笔记而写,如有错误请多多指教,不喜请轻喷!
MVP模式图:
MVP的三层交互:Model主要负责数的存取, View主要负责与用户交互, Presenter充当Model和View之间的桥梁
MVP主要目的是降低耦合度,实现了Model和View的分离,从而达到修改View而不影响Model的目的。
(1) View :负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2) View interface :需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3) Model :负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4) Presenter :作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
MVC模式、MVP模式和MVVM模式都作为用来分离UI层与业务层的一种开发模式。这些模式之间的差异可以归纳为对这个问题处理的方式的不同。
以下是一个迷你的mvp模式Demo
需求:存储用户和金钱,根据名字取金钱
整体Project结构
先创建一个UserBean.java:
public class UserBean {
private String name;
private int money;
public UserBean(String name, int money) {
this.name = name;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
创建IUserModel,给UserModel实现接口供Precenter向UserModel 存、取数据
IUserModel.java:
public interface IUserModel {
// 存储数据
void setName(String name);
void setMoney(int money);
// 获取数据
UserBean load(String name);
}
UserModel .java(UserModel实现IUserModel接口):
public class UserModel implements IUserModel {
private String mName;
private int mMoney;
private Map<String, UserBean> mUsers = new HashMap<>();
@Override
public void setName(String name) {
mName = name;
}
/**
* 保存数据 数据由 Precenter 设置过来
* @param money
*/
@Override
public void setMoney(int money) {
mMoney = money;
UserBean userBean = new UserBean(mName, mMoney);
mUsers.put(mName, userBean);
}
/**
* 给 Precenter 提供数据
* @param name
* @return 根据名字 返回 bean
*/
@Override
public UserBean load(String name) {
return mUsers.get(name);
}
}
创建IUserView.java: 供UserViewActivity实现 & 给Precenter 进行交互
public interface IUserView {
String getName();
int getMoney();
void setName(String name);
void setMoney(int money);
}
创建Precenter.java 负责担任Model和View间的桥梁,进行数据的交互
/**
* Created by Sen on 2016/10/9.
*
* 在 view 层拿到数据
* 向MOdel存/取数据
*/
public class UserPrecenter {
private final IUserModel mUserModel;
private final IUserView mUserView;
public UserPrecenter(IUserView view) {
mUserView = view;
mUserModel = new UserModel();
}
/**
* 给Activity 保存数据
* @param name
* @param money
*/
public void saveInfo(String name, int money) {
mUserModel.setName(name);
mUserModel.setMoney(money);
}
/**
* 给 Activity 获取数据
* @param name
*/
public void loadInfo(String name) {
UserBean user = mUserModel.load(name);
mUserView.setName(user.getName());
mUserView.setMoney(user.getMoney());
}
}
UserViewActivity.java:
/**
* 需求 根据姓名 存钱 和 取钱
*/
public class UserViewActivity extends AppCompatActivity implements IUserView {
@Bind(R.id.edt_name)
EditText mEdtName;
@Bind(R.id.edt_money)
EditText mEdtMoney;
@Bind(R.id.safe)
Button mSafe;
@Bind(R.id.load)
Button mLoad;
private UserPrecenter mUserPrecenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_view);
ButterKnife.bind(this);
mUserPrecenter = new UserPrecenter(this);
}
@OnClick({R.id.safe, R.id.load})
public void onClick(View view) {
switch (view.getId()) {
case R.id.safe: // 存储数据
mUserPrecenter.saveInfo(getName(), getMoney());
break;
case R.id.load: // 获取数据
mUserPrecenter.loadInfo(getName());
break;
}
}
@Override
public String getName() {
return mEdtName.getText().toString();
}
@Override
public int getMoney() {
return Integer.parseInt(mEdtMoney.getText().toString());
}
@Override
public void setName(String name) {
// 拿到数据 进行数据的处理逻辑
Log.d("it", "name:" + name);
}
@Override
public void setMoney(int money) {
// 拿到数据 进行数据的处理逻辑
Log.d("it", "money:" + money);
}
}
这样子代码就完成了
界面: