这是我参与「第四届青训营 」笔记创作活动的第2天
设计模式的定义
设计模式是软件设计中常见问题的解决方案模型。
常见问题:与历史经验无关
解决方案模型:与特定语言无关
设计模式分类
前端共有23种设计模式,又分为3种模式。
- 创造型:如果创建一个对象。
- 结构型:如何灵活的将对象组装成较大的结构。
- 行为型:负责对象间的高效通信和责任划分。
一些重要原则
开闭原则
开闭原则是编程中最基础、最重要设计原则
- 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。
- 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
- 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
- 对扩展开放,对修改封闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
单一职责原则
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
里氏替换原则
子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。通俗理解就是子类可以扩展父类的功能,但不能改变父类原有的功能。里氏替换原则是对开闭原则的补充。
依赖倒转原则
依赖倒转的中心思想是:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口
迪米特原则
一个类对自己依赖的类知道的越少越好。无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。
合成/聚合复用原则
合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。尽量首先使用合成/聚合的方式,而不是使用继承。即首先考虑作为成员变量来调用另一个类的方法。
浏览器中的设计模式
- 单例模式
- 发布订阅模式
单例模式
定义:全局唯一访问对象,在任何时候都能够访问到其身上的数据方法等,比如window对象。
应用场景:缓存,全局状态管理等
优点:
- 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
- 避免对资源的多重占用(比如写文件操作)。
缺点:
- 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
发布订阅模式
定义:一种订阅机制,可在被订阅对象发生变化时通知订阅者
应用场景:从系统架构之间的解耦,到业务中一些实现模式,像邮箱订阅,上线订阅等等,应用广泛。
优点:
- 耦合性低,便于代码的维护
缺点:
- 创建订阅者本身要消耗一定的时间和内存,可能订阅的消息未发生,但这个订阅者会始终存在于内存中
javaScript中的设计模式
原型模式
定义:复制已有对象来创建新的对象。
应用场景:JS中对象创建的基本模式。
代理模式
定义:可自定义控制对原对象的访问方式,并且允许在跟新前后做一些额外处理。
应用场景:监控,代理工具,前端框架实现等,比如Vue中的数据代理。
迭代器模式
定义:在不暴露数据类型下访问集合中的数据。
应用场景:数据接口中有多种数据类型,列表,树等。提供通用操作接口。
总结
通过青训营课程中对前端设计模式内容的学习,我学习到前端需要涉及到的一些设计模式基础原理,这都是之前未接触到的知识点,希望自己能加强掌握