MVP架构初体验

转载请注明出处:http://blog.csdn.net/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.csdn.net/detail/magic_jss/9597607;

项目是基于Google官方MVP Demo中MVP最基本的使用方法所写的例子,若大家感兴趣可以去看Google MVP Demo中其他几类的使用方法。 如果该文章帮助到了你记得留言讨论哦。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值