1. 什么是 MVVM?比之 MVC 有什么区别?什么又是 MVP ?
1.1. MVVM 模式
MVVM(Model-View-ViewModel)是一种架构模式,主要用于构建用户界面。它将应用程序分为三个主要组件:
- Model(模型):负责管理应用程序的数据和业务逻辑。
- View(视图):负责用户界面的展示,通常由用户直接看到的内容组成。
- ViewModel(视图模型):作为模型和视图之间的桥梁,负责处理视图显示所需的数据准备逻辑,并将视图的事件映射到模型的操作。
MVVM 的一个关键特性是数据绑定,即视图与视图模型之间的自动同步。这种同步使得开发者可以专注于数据和业务逻辑,而无需手动更新视图。
1.2. MVVM 与 MVC 的区别
MVC(Model-View-Controller)也是一种经典的架构模式,但它与 MVVM 存在一些关键区别:
- Controller(控制器):在 MVC 中,控制器负责处理用户输入,并更新模型和视图。而在 MVVM 中,视图模型(ViewModel)承担了类似控制器的部分责任,但视图模型的主要职责是为视图准备数据,而不是直接处理用户输入。
- 数据绑定:MVVM 强调数据绑定,视图和视图模型之间的数据可以自动同步。MVC 中的数据传递通常是单向的,从控制器到视图,视图无法直接与模型交互。
- 职责分离:MVVM 更加强调视图的职责,视图不必了解业务逻辑,只负责显示数据。而 MVC 中,视图可以包含一些简单的展示逻辑,但通常需要控制器来协调视图和模型之间的交互。
- MVVM 模式中的 VM,指的是 ViewModel,它和 MVP 的思想其实是相同的,不过它通过双向的数据绑定,将 View 和 Model 的同步更新给自动化了。当 Model 发生变化的时候,ViewModel 就会自动更新;ViewModel 变化了,View 也会更新。这样就将 Presenter 中的工作给自动化了。我了解过一点双向数据绑定的原理,比如 vue 是通过使用数据劫持和发布订阅者模式来实现的这一功 能。
1.3. MVP 模式
MVP(Model-View-Presenter)也是一种架构模式,主要用于开发复杂的用户界面。它由以下三个主要组件构成:
- Model(模型):负责管理应用程序的数据和业务逻辑,与 MVVM 中的模型相同。
- View(视图):负责用户界面的展示,通常由用户直接看到的内容组成,与 MVVM 中的视图相同。但在 MVP 中,视图相对被动,它不具备任何业务逻辑,仅负责展示。
- Presenter(表现层):作为视图和模型之间的桥梁,负责处理用户输入,更新模型,并将视图的展示逻辑与模型的操作隔离。它类似于 MVVM 中的视图模型,但职责更为明确,表现层只负责将数据从模型传递到视图,或者将用户操作传递给模型。
1.4. 总结
- MVVM 强调数据绑定和视图的自动更新,适合需要高数据同步和用户交互的场景。
- MVC 通过控制器协调视图和模型,适合需要清晰职责分离和展示逻辑的场景。
- MVP 将视图逻辑完全移到表现层,视图只负责展示,适合需要复杂用户交互且需要清晰职责分离的场景。
2. 设计模式分类
- 创建型模式:用于描述如何创建对象,包括 1.工厂方法模式、2.抽象工厂模式、3.单例模式、4.建造者模式、5.原型模式。
- 结构型模式,共七种:1.适配器模式、2.装饰器模式、3.代理模式、4.外观模式、5.桥接模式、6.组合模式、7.享元模式。
- 行为型模式,共十一种: 1.策略模式、2.模板方法模式、3.观察者模式、4.迭代子模式、5.责任链模式、6.命令模式、7.备忘录模式、8.状态模式、9.访问者模式、10.中介者模式、11.解释器模式。
3. 设计模式的六大原则
开闭原则:一个软件实体应当对扩展开放,对修改关闭。 单一职责原则:一个类只负责一项职责,其逻辑应该简单而直接。 依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖抽象。 接口隔离原则:使用多个专门的接口,而不使用单一的总接口。 迪米特法则:一个对象应该对其他对象保持最少的了解。简称类间解耦 组合/聚合复用原则:尽量使用组合/聚合关系而不是继承关系来达到代码复用的目的。
4. 单例模式
保证一个类只有一个实例,并且提供一个访问该全局访问点
4.1. 那些地方用到了单例模式?
- 网站的计数器,一般也是采用单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。
- 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
- Windows 的(任务管理器)就是很典型的单例模式,他不能打开俩个
- windows 的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
4.2. 单例模式的优点
- 节省内存,避免频繁的创建销毁对象,降低系统开销。
- 避免对共享资源的多重占用,可以避免一些线程安全问题。
- 单例模式可以方便地全局访问,优化和共享资源。
4.3. 单例模式的缺点
- 单例模式一般没有接口,扩展比较困难,不适用于变化的对象。
- 单例模式违反了依赖倒置原则,如果要改动实现,则涉及到修改全局变量,破坏了系统的封装性。
- 单例模式在多线程环境下需要加锁,效率会受到影响。
5. 工厂模式
将对象的创建逻辑与使用逻辑分离,由专门的 “工厂类” 负责对象实例化,从而降低代码耦合度、提高可扩展性和可维护性。
5.1. 工厂模式好处
- 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替 new 操作的一种模式。
- 利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。
- 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
5.2. 工厂模式缺点:
- 类数量膨胀:每新增一个产品,需同时新增一个工厂类,导致系统中类的数量翻倍。
- 调用复杂度提高:调用者需知道 “产品对应哪个工厂”(如创建 BMW 需使用 BMWFactory),而非简单传递参数。
6. 观察者模式和发布订阅模式分别是什么?有什么区别?
观察者模式:一个对象(观察者)订阅另一个对象(主题),当主题被激活的时候,触发观察者里面的事件。
发布订阅模式:订阅者把自己想要订阅的事件注册到调度中心,当发布者发布事件到调度中心(就是该事件被触发),再由调度中心统一调度订阅者注册到调度中心的处理代码。
###发布订阅模式应用场景:
- 全局事件总线
- Redux/Vuex 状态管理
- WebSocket 消息处理
- 微前端通信
- DOM 事件系统
| 特性 | 观察者模式 | 发布订阅模式 |
| 耦合度 | 较高(直接引用) | 较低(通过中间件) |
| 灵活性 | 较低 | 较高 |
| 实现复杂度 | 简单 | 相对复杂 |
| 典型应用 | Vue 响应式、表单验证 | 事件总线、状态管理 |
| 性能影响 | 直接调用,性能较好 | 需要查找订阅者,稍慢 |