架构 MVC、MVP、MVVM 烂大街的问题,一般会问它们的优缺点各是什么?
架构设计的目的
通过设计使程序模块化、组件化,从而做到高内聚低耦合,让开发者能更专注于功能实现本身,提供程序开发效率、更容易进行测试、维护和定位问题等等。而且,不同的规模的项目应该选用不同的架构设计。
MVC
Model-View-Controller,是一种分层解偶的框架
Model层提供本地数据和网络请求,View层处理视图,Controller处理逻辑
缺点是Controller层和View层的划分不明显,Model层和View层的存在耦合
MVP
Model-View-Presenter,是对MVC的升级,Model层和View层与MVC的意思一致,
但Model层和View层不再存在耦合,而是通过Presenter层这个桥梁进行交流
通过view和p层即Presenter的相互持有,p调用model,将逻辑方法抽象成接口,presenter中去具体实现,view层只是调用p的方法;
优点是模型视图完全分离,presenter中的方法可以重用,缺点是presenter与view联系紧密,视图改变,presenter也要随之改变,实现方法过多,不易维护
MVVM
Model-View-ViewModel,不同于上面的两个框架,ViewModel持有数据状态,当数据状态改变的时候,会自动通知View层进行更新。
缺点
-
数据绑定也使得bug很难被调试。
比如你看到页面异常了,有可能是你的View的代码有bug,也可能是你的model的代码有问题。数据绑定使得一个位置的Bug被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。 -
数据双向绑定不利于代码重用。客户端开发最常用的是View,但是数据双向绑定技术,让你在一个View都绑定了一个model,不同的模块model都不同。那就不能简单重用view了
-
一个大的模块中model也会很大,虽然使用方便了也很容易保证数据的一致性,但是长期持有,不释放内存就造成话费更多的内存
AOP面向切面编程
切面(Aspect):指的就是通用功能的代码实现,比如我们上面演示的时间记录切面,日志切面,它们都是普通的Java类:TimeRecordingAspect和LogAspect。
目标对象(Target):要被织入切面的对象,例子中的CtripBookingService,有了AOP,它们可以专注于核心业务逻辑代码了!
切入点(Pointcut):定义通知应该切入到什么地方,Spring支持的切入点就是方法调用,切入点的定义可以使用正则表达式,用以描述什么类型的方法调用。@Pointcut就是用来定义切入点的。
通知(Advice):切面是一个类,而通知就是类里的方法以及这个方法如何织入到目标方法的方式(用@AfterReturning和@Around标注的方法)。我们的例子中只展示了两类通知,根据织入到目标方法方式的不同,一共可以分为5种: