一直致力于提高开发效率降低项目耦合,今天想抽空学习一下 MVP 架构设计模式,学习一下如何运用到项目中。
MVP 模式是一种架构设计模式,也是一种经典的界面模式。MVP 中的 M 代表 Model, V 是 View, P 是 Presenter。
先看下整个栗子的结构示意图
Model 代表业务逻辑和实体模型,栗子中的M层包含一个实体类 UserEntity,具体代码如下:
- public class UserEntity {
- 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 voidsetAge(int age) {
- this.age = age;
- }
- }
一个获取 user 列表的契约接口类 IUserModel
- public interface IUserModel {
- void loadUserEntities(IGetUserEntitiesListener listener);
- }
一个实现 IUserModel 的实现类 UserModelImpl
- public classUserModelImplimplements IUserModel {
- @Override
- public voidloadUserEntities(final IGetUserEntitiesListener listener) {
- //模拟网络请求数据过程
- newHandler(Looper.getMainLooper()).postDelayed(new Runnable() {
- @Override
- public void run() {
- List userModels = newArrayList<>();
- inttestCount = 20;
- for(inti = 0; i < testCount; i++) {
- UserEntity userModel =new UserEntity();
- userModel.setAge(i * 5);
- userModel.setName(String.format("李%d", i));
- userModels.add(userModel);
- }
- listener.onGetUserEntities(userModels);
- }
- }, 3000);
- }
- }
回调结果的 IGetUserEntitiesListener 接口类
- public interface IGetUserEntitiesListener {
- voidonGetUserEntities(List userEntities);
- }
这里的V层为一个接口契约类和 Activity,负责 View 的绘制以及与用户交互,首先看下契约接口类
- public interfaceILoadDataView {
- voidstartLoading();//开始加载
- voidloadFailed();//加载失败
- voidloadSuccess(List list);//加载成功
- voidfinishLoading();//结束加载
- }
Activity 代码如下
- public classMainActivityextendsAppCompatActivityimplementsILoadDataView {
- private MyAdapter mMyAdapter;
- private ProgressDialog mProgressDialog;
- private LoadUserEntitiesPresenter 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 =newMyAdapter(this);
- testListView.setAdapter(mMyAdapter);
- mLoadListPresenter =newLoadUserEntitiesPresenter(this);
- findViewById(R.id.test_button).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mMyAdapter.removeDatas();
- mMyAdapter.notifyDataSetChanged();
- mLoadListPresenter.loadUserEntities();
- }
- });
- }
- @Override
- public void startLoading() {
- mProgressDialog =newProgressDialog(this);
- mProgressDialog.setMessage("正在加载中");
- mProgressDialog.show();
- }
- @Override
- public void loadFailed() {
- }
- @Override
- public voidloadSuccess(List list) {
- mMyAdapter.addDatas(list);
- mMyAdapter.notifyDataSetChanged();
- }
- @Override
- public void finishLoading() {
- if(mProgressDialog !=null) {
- mProgressDialog.dismiss();
- mProgressDialog =null;
- }
- }
首先看下 Presenter 的实现,包括一个 ILoadUserEntitiesPresenter 契约接口类和 LoadUserEntitiesPresenter 实现类
ILoadUserEntitiesPresenter 类代码
- public interface ILoadUserEntitiesPresenter {
- void loadUserEntities();
- }
- LoadUserEntitiesPresenter实现类
- public classLoadUserEntitiesPresenterimplements ILoadUserEntitiesPresenter {
- privateILoadDataView mILoadListView;
- private UserModelImpl mUserModel;
- publicLoadUserEntitiesPresenter(ILoadDataView mILoadListView) {
- this.mILoadListView = mILoadListView;
- this.mUserModel =new UserModelImpl();
- }
- @Override
- public void loadUserEntities() {
- mILoadListView.startLoading();
- mUserModel.loadUserEntities(new IGetUserEntitiesListener() {
- @Override
- public voidonGetUserEntities(List userEntities) {
- mILoadListView.loadSuccess(userEntities);
- mILoadListView.finishLoading();
- }
- });
- }
- }
这里仅仅就是MVP的简单实现,为了方便简单的认识MVP分层以及各层的职责与作用。
来源: http://www.cnblogs.com/whoislcj/p/6646925.html