• 模型层(Model):我们针对业务模型,建立的数据结构和相关的类,就可以理解为Model。Model是与View无关,而与业务相关的。• 视图层(View):一般采用 XML 文件或者 Java 代码进行界面的描述,也可以使用JavaScript+HTML等方式作为View层。• 控制层(Controller):Android 的控制层通常在 Activity、Fragment 或者由它们控制的其他业务类中。
1. Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而做出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。 2.View层和Model层相互耦合,不易开发和维护。
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过Controller。
在开发的时候,Model-提供数据,View负责UI,Presenter,负责处理逻辑,提供view需要的数据,各执其责,这样,各个模式,各个类,分工明确,可以清晰的,降低耦合,层级职责更明显,易于单元测试
mvp模式的简单理解
MVP模式呢,就是把Activity复杂的逻辑,拆分并分类,都有各个的职责,那么这样逻辑也清楚了,也利于维护,咱们就拿很乱的房间做比喻,房间东西少的话我们就能很快的找到自己想要的东西,那么东西多了,有放的比较乱,那么我们找起来是不是很费劲,如果把相应的东西摆到相应的位置那么,我们房间东西再多我们也能找到自己想要的东西,那如果项目还有新的需求我们也很容易的添加新的功能,我们也可以单独按照新的分类,分出一块添加到项目中,这样就有利于更新,维护我们的项目
那么咱们简单实现一个MVP模式完成的项目。
首先我们写Model
public class DataModel { List<String> data = new ArrayList<>(); ModelInterface mCallback; public DataModel(ModelInterface mCallback){ this.mCallback = mCallback; } public void getData(){ for (int i = 0; i < 100; i++) { data.add(i + "item"); } mCallback.loadSuccess(data); new AsyncTask<String,Integer, List<String> >(){ @Override protected List<String> doInBackground(String... strings) { for (int i = 0; i < 100; i++) { data.add(i + "item"); } return data; } @Override protected void onPostExecute(List<String> list) { super.onPostExecute(list); mCallback.loadSuccess(list); } }; } }数据封装好了,我们可以在Application 类初始化 让数据刚运行的时候就加载出来
public class MVPApp extends Application { @Override public void onCreate() { super.onCreate(); new DataModel(new MvpPrenter()).getData(); } }接口:成功操作数据,失败提示
public interface ModelInterface { void loadSuccess(List<String> data); void loadFailed(); }Presenter处理逻辑提供数据
public class MvpPrenter implements ModelInterface { DataModel dataModel = new DataModel(this); MvpView mvpView ; public MvpPrenter(MvpView mvpView){ this.mvpView = mvpView; } @RequiresApi(api = Build.VERSION_CODES.N) @Override public void loadSuccess(List<String> data) { mvpView.setListItem(data); } @Override public void loadFailed() { } }View的使用
public class MainActivity extends AppCompatActivity implements MvpView{ private MvpPrenter mvpPrenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mvpPrenter = new MvpPrenter(this); } @RequiresApi(api = Build.VERSION_CODES.N) @Override public void setListItem(List<String> data) { data.forEach(new Consumer<String>() { @Override public void accept(String s) { // Log.i("loadSuccess",s); } }); } } public interface MvpView { void setListItem(List<String> data); }