就一个十分简单的获取列表数据并展示的Demo;分别使用MVC和MVP实现;
先来一个假的数据源:
//假设这就是数据源 public class UserBean { public static List<String> datas = Arrays.asList("CCB","JY","YHL","ZQ","ZJH","XSN"); }
MVC模式:
public class CActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_c); TextView tv = findViewById(R.id.tv); List<String> datas = UserBean.datas; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i <datas.size() ; i++) { stringBuilder.append("\n"+datas.get(i)); } tv.setText(stringBuilder); } }
完成,十分的简单;
如果业务逻辑比较简单,没有必要使用MVP模式。MVP模式的优点就是解耦性强,让界面只专注UI的处理,跟Android API无关的业务逻辑由 Presenter 层来完成;
好了,接下来是MVP模式了:认真学认真看;
首先定义一个UserContract类,它是V和P的中间层,也是M给P反馈信息的载体;
public interface UserContract { /** * View接口是Activity(Fragment)与Presenter层的中间层,它的作用是根据具体业务的需要, * 为Presenter提供调用Activity中具体UI逻辑操作的方法 */ interface View extends BaseView<Presenter>{ void showText(List<String> datas); } /** * Presenter接口是Model层给Presenter层反馈请求信息的传递载体, * 所以需要在Presenter中定义数据请求的各种反馈状态: */ interface Presenter extends BasePresenter{ void setData(); void login(); } }
通用的方法定义两个基类,写在基类中:
public interface BaseView<T> { void setPresenter(@NonNull T presenter); void showDialog(); void dissmisDialog(); void onError(); }
public interface BasePresenter { void start(); }
接下来是UserPresenter类,它就是P层;
public class UserPresenter implements UserContract.Presenter{ /** * UserPresenter类是具体的逻辑业务处理类,负责请求数据,并对数据请求的反馈进行处理。 UserPresenter类的构造方法中有一个View接口的参数,是为了能够通过View接口通知Activity进行更新界面等操作。 */ private UserContract.View v; public UserPresenter(UserContract.View v){ this.v = v; this.v.setPresenter(this); } @Override public void start() { v.showText(UserBean.datas); } @Override public void setData() { } @Override public void login() { } }
V层:Activity:
/** * 调用UserPresenter就要先实现Presenter需要的对应的View接口 */ public class PActivity extends AppCompatActivity implements UserContract.View{ private TextView tv; private UserContract.Presenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_c); tv = findViewById(R.id.tv); new UserPresenter(this); presenter.start(); } @Override public void showText(List<String> datas) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i <datas.size() ; i++) { stringBuilder.append("\n"+datas.get(i)); } tv.setText(stringBuilder); } @Override public void setPresenter(@NonNull UserContract.Presenter presenter) { this.presenter = presenter; } @Override public void showDialog() { } @Override public void dissmisDialog() { } @Override public void onError() { } }