前言:
一直致力于提高开发效率降低项目耦合,今天想抽空学习一下MVP架构设计模式,学习一下如何运用到项目中。
MVP架构设计模式
MVP模式是一种架构设计模式,也是一种经典的界面模式。MVP中的M代表Model, V是View, P是Presenter。
- Model 业务逻辑和实体模型
- View 代表的是一个接口,一个将UI界面提炼而抽象出来的接口。
- Presenter Model和View之间的桥梁
为什么采用MVP
- 降低耦合度
- 模块职责划分明显
- 利于测试驱动开发
- 代码复用
- 隐藏数据
- 代码灵活性
举个栗子说明一下
先看下整个栗子的结构示意图
1)首先我们先看M层
Model代表业务逻辑和实体模型,栗子中的M层就是一个实体类UserModel,具体代码如下:
public class UserModel {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
M层承担的依然是数据模型和业务逻辑
2)V层就是页面的展示与加载
这里的V层为一个接口契约类和Activity,负责View的绘制以及与用户交互,首先看下契约接口类
public interface ILoadDataView<T> {
void startLoading();//开始加载
void loadFailed();//加载失败
void loadSuccess(List<T> list);//加载成功
void finishLoading();//结束加载
}
Activity代码如下
public class MainActivity extends AppCompatActivity implements ILoadDataView<UserModel> {
private MyAdapter mMyAdapter;
private ProgressDialog mProgressDialog;
private LoadDataPresenter mLoadListPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
ListView testListView = (ListView) findViewById(R.id.test_listView);
mMyAdapter = new MyAdapter(this);
testListView.setAdapter(mMyAdapter);
mLoadListPresenter = new LoadDataPresenter(this);
findViewById(R.id.test_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMyAdapter.removeDatas();
mMyAdapter.notifyDataSetChanged();
mLoadListPresenter.loadDataFromServer();
}
});
}
@Override
public void startLoading() {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("正在加载中");
mProgressDialog.show();
}
@Override
public void loadFailed() {
}
@Override
public void loadSuccess(List<UserModel> list) {
mMyAdapter.addDatas(list);
mMyAdapter.notifyDataSetChanged();
}
@Override
public void finishLoading() {
if (mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
}
3)P层负责完成View于Model间的交互,由P处理大部分业务逻辑,分别操作M层和V层
首先看下Presenter的实现
public class LoadDataPresenter {
private ILoadDataView<UserModel> mILoadListView;
public LoadDataPresenter(ILoadDataView<UserModel> mILoadListView) {
this.mILoadListView = mILoadListView;
}
public void loadDataFromServer() {
mILoadListView.startLoading();
//模拟网络请求数据过程
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
List<UserModel> userModels = new ArrayList<>();
int testCount = 20;
for (int i = 0; i < testCount; i++) {
UserModel userModel = new UserModel();
userModel.setAge(i * 5);
userModel.setName(String.format("李%d", i));
userModels.add(userModel);
}
mILoadListView.loadSuccess(userModels);
mILoadListView.finishLoading();
}
}, 3000);
}
}
总结:
这里仅仅就是MVP的简单实现,为了方便简单的认识MVP分层以及各层的职责与作用。
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!