转载请注明出处:http://blog.youkuaiyun.com/magic_jss/article/details/52144019;
是否对越来越多的业务需求感到力不从心,是否对越来越臃肿的代码感到反感,或许MVP模式在一定程度上能帮助到我们,所谓模式不过是代码编写时对我们有指导性意义而非约束性,若过分遵循岂不是缺少了很多个人风格(三哥除外!!!),欢迎评论交流哦!
1、什么是MVP?
MVP:一种架构模式,简言之就是一种软件开发的规则。包括Model层、View层、Presenter层。
View层:负责处理用户事件和视图部分的展示。Activity、Fragment。
Model层:负责访问数据,获取数据,数据实体类。数据包括后台数据、本地数据。
Presenter层:连接View和Model的桥梁。
(此图来自互联网,若作者不同意,会及时替换)
MVP的优势?
- View层和Model层的完全解耦合
- 减小臃肿代码,提高代码可维护性
- 方便单元测试
2、MVP初体验
Model层
/**
* Created by magic on 2016年8月7日.
*/
public class User {
String name;
int age;
public User(String name, int age) {
super();
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
契约接口
/**
* Created by magic on 2016年8月7日.契约接口 方便查看view层和Presenter层逻辑关系
*/
public interface UserContract {
interface View extends BaseView<Presenter> {
// 隐藏加载框
void showProgressDialog();
// 隐藏加载框
void dismissProgressDialog();
// 显示数据
void showUser(List<User> list);
// 关闭下拉刷新
void closePullDownRefurbish();
}
interface Presenter extends BasePresenter {
// 加载数据
void loadUser(boolean isFirst);
}
}
该接口主要将View层接口和Presenter层接口封装在一块方便统一查看和统一调度。其中BaseView、BasePresenter 又分别是View层级和Presenter层级的基类接口。
/**
* Created by magic on 2016年8月7日. view层抽象基类
*/
public interface BaseView<T> {
// 设置Presenter
void setPresenter(T presenter);
}
/**
* Created by magic on 2016年8月7日.Presenter层抽象基类
*/
public interface BasePresenter {
// 设置统一初始化方法
void start();
}
Presenter层
/**
* Created by magic on 2016年8月7日.Presenter层
*/
public class UserPresenter implements UserContract.Presenter {
private UserContract.View view;
public UserPresenter(View view) {
super();
this.view = view;
view.setPresenter(this);
}
@Override
public void start() {
loadUser(true);
}
@Override
public void loadUser(final boolean isFirst) {
// 处理获取数据逻辑
if (isFirst) {
view.showProgressDialog();
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//该部分可放在Model层处理
List<User> list = new ArrayList<User>();
for (int i = 0; i < 5; i++) {
list.add(new User("MAGIC" + i, 20));
}
view.showUser(list);
if (isFirst) {
view.dismissProgressDialog();
} else {
view.closePullDownRefurbish();
}
}
}, 3000);
}
}
View层将业务逻辑委托给UserPresenter处理,UserPresenter通过Model层获取数据并处理相关逻辑,然后通过View层的接口回调通知界面刷新。
UserPresenter 实现契约类中的UserContract.Presenter接口并通过构造方法将UserContract.View接口对象传递进来并调用它的setPresenter()方法。
View层
/**
* Created by magic on 2016年8月7日. View层
*/
public class MainActivity extends Activity implements UserContract.View {
//自定义下拉刷新的listview
PullDownRefurbishListView listView;
ProgressDialog dialog;
List<User> list = new ArrayList<User>();
MyAdapter adapter;
UserContract.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
listView = (PullDownRefurbishListView) findViewById(R.id.listview);
dialog = new ProgressDialog(this, ProgressDialog.STYLE_HORIZONTAL);
adapter = new MyAdapter(this, list);
listView.setAdapter(adapter);
listView.setIPullDownRefurbish(new PullDownRefurbishListView.IPullDownRefurbish() {
@Override
public void refurbish() {
// 下拉刷新处理
presenter.loadUser(false);
}
});
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(
MainActivity.this,
"name:" + adapter.getItem(position - 1).getName()
+ " age:"
+ adapter.getItem(position - 1).getAge(),
Toast.LENGTH_SHORT).show();
}
});
new UserPresenter(this);
presenter.start();
}
@Override
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
@Override
public void showProgressDialog() {
dialog.show();
}
@Override
public void dismissProgressDialog() {
dialog.dismiss();
}
@Override
public void showUser(List<User> list) {
this.list.addAll(list);
adapter.notifyDataSetChanged();
}
@Override
public void closePullDownRefurbish() {
// 关闭下拉刷新
listView.setPullDownRefurbishFinish();
}
}
MainActivity实现契约类中的UserContract.View接口,通过 UserContract.Presenter 接口对象调用相关方法,改变View的显示内容。
整个项目下载地址:http://download.youkuaiyun.com/detail/magic_jss/9597607;
项目是基于Google官方MVP Demo中MVP最基本的使用方法所写的例子,若大家感兴趣可以去看Google MVP Demo中其他几类的使用方法。 如果该文章帮助到了你记得留言讨论哦。