/**
* 每天一个知识点day66 TODO MVC MVP MVVM
*
* MVC:
*
* view(视图层)
* controller(控制层)
* model(模型层)
* View接收到用户的操作,交给Controller,Controller完成具体的业务逻辑,
* 得到结果封装成Model,再进行View的更新
* view对应xml布局文件
* model对应实体模型
* controller对应activity业务逻辑,处理数据和UI处理。
* 缺点:
* 1.Activity并不是MVC中标准的Controller,既有Controller的职责也有View的职责,
* 导致Activity的代码过于臃肿。
* 2.View层和Model层互相耦合,耦合过重,代码量过大,不易于开发和维护。
*
* MVP:
*
* MVP架构由MVC发展而来
* 模型层(Model):主要是获取数据功能,业务逻辑和实体模型。
* 视图层(View):对应于Activity或Fragment,负责视图的部分展示和业务逻辑用户交互
* 控制层(Presenter):负责完成View层与Model层间的交互,通过P层来获取M层中数据后返回给V层,
* 使得V层与M层间没有耦合。
* Presenter层完全将View层和Model层进行了分离,把主要程序逻辑放在Presenter层实现,
* Presenter与具体的View层(Activity)是没有直接的关联,是通过定义接口来进行交互的,
* 从而使得当View层(Activity)发生改变时,Persenter依然可以保持不变。
* View层接口类只应该只有set/get方法,及一些界面显示内容和用户输入,
* 除此之外不应该有多余的内容。绝不允许View层直接访问Model层
*
* 优点:
* 1.降低耦合度 Model和View的解耦
* 2.模块职责划分明显
* 3.代码清晰灵活,便于复用
* 4.方便测试,可以单独对Model层和View层进行测试。
*
* 缺点:
* 1.MVP的中使用了接口的方式去连接view层和presenter层,
* 如果有一个逻辑很复杂的页面,接口会有很多,导致维护接口的成本非常大。
* 解决办法:尽可能将一些通用的接口作为基类,其他的接口去继承。
*
* MVP优化:
* 采用泛型定义契约类,将model、view、presenter定义在一个契约类中
* 结构清晰,一个契约类对应一个业务模块。
*
*
* Presenter中处理子线程任务完成后,一般会回到主线程调用View的方法刷新UI,
* 但如果此时activity已经销毁,并且没有取消子线程的任务(例如网络请求),
* 此时去调用View的方法很容易发生空指针,应该在调用之前判断一下,
* 因此建议view增加一个isActive()方法,用于判断当前view是否可见
*
* 除此之外,如果子线程的任务会持续很久,或者由于网络等额外因素导致子线程耗时过久,
* 但此时activity其实已经destroy了,presenter的子线程还在运行则不会被GC,
* 并且presenter持有了fragment(view),导致了内存泄露。
* 解决这个问题可以通过弱引用的方式解决。
*
* public abstract class BasePresenterImpl<V extends BaseView> implements BasePresenter {
* protected WeakReference<V> mView;
* public BasePresenterImpl(V view) {
* mView = new WeakReference<V>(view);
* view.setPresenter(this);
* }
* protected boolean isViewActive() {
* return mView != null && mView.get().isActive();
* }
* public void detachView() {
* if (mView != null) {
* mView.clear();
* mView = null;
* }
* }
* }
*
* MVVM:
*
* view -> <- viewmodel -> <- model
*
* 1.Model-View-ViewModel,将Presenter替换为ViewModel。
* 2.ViewModel和Model/View进行了双向绑定。
* 3.View发生改变时,ViewModel会通知Model进行更新数据
* 4.Model数据更新后,ViewModel会通知View更新显示
* 5.谷歌发布了MVVM支持库Data Binding:能将数据绑定到xml中
* 6.现在谷歌又推出了ViewModel和LiveData组件用于更方便的实现MVVM
*
* 优点:
* 1.双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化。
* 2.View可以像控制器一样具有自己的View-Model.
* 3.由于控制器的功能大都移动到View上处理,大大的对控制器进行了瘦身
* 4.可以对View或ViewController的数据处理部分抽象出来一个函数处理model。
*
* 缺点:
* 1.数据绑定使得Bug很难被调试。你看到界面异常了,有可能是你View的代码有Bug,也可能是 Model 的代码有问题。
* 数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。
* 2.一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,
* 不释放内存,就造成了花费更多的内存。
* 3.数据双向绑定不利于代码重用。
* 客户端开发最常用的重用是View,但是数据双向绑定技术,
* 让你在一个View都绑定了一个model,不同模块的model都不同。那就不能简单重用View了。
*
*/
网友评论