参考博客:https://juejin.cn/post/6844904032826294286

最少知识原则:

迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。 英文简写为: LOD。

简要概括每种设计模式的含义:

  • 工厂模式:定义一个用于创建对象的接口,子类通过该接口决定实例化哪一个类。现有类A,它有工厂子类B,调用B的 create 方法会创建A的一个实例对象。实例:jQuery的$

  • 单例模式:一个类只有一个实例,并提供一个访问它的全局访问点。实例:登录框

  • 适配器模式:将一个类的接口转化为另外一个接口,从而满足需求。形象地理解,就是提供一个不同版本的插头。比如类A中有方法 method,B中定义同名方法,该方法内执行A的 method 并做额外的适配。实例:Vue 的computed

  • 装饰者模式:在不改变原对象的基础上,动态地给某个对象添加一些额外的职责(拓展功能),是一种实现继承的替代方案。比如A对象可以创建一个手机,B是A的装饰者,则B对象在创建手机的时候同时创建一个手机壳

  • 代理模式:为一个对象提供一个代理,以便控制对它的访问。A请求代理,代理做一些事后请求B

  • 外观模式:定义了一个高层接口,为子系统的一组接口提供一个一致的界面,比如兼容浏览器事件绑定(if-else 为不同的浏览器提高不同的方法)、封装接口(把众多接口集中在一起),不符合开闭原则

  • 观察者模式:多个观察者对象同时监听某一个主题对象,主题对象的状态发生变化时就会通知所有的观察者对象,使它们能够自动更新自己。实例:DOM 事件、Vue 响应式

    观察者模式 和 发布/订阅模式 的区别:

    观察者模式:观察者观察目标(监听目标)=> 目标发生变化 => 目标主动通知观察者。观察者对应订阅者,目标对应发布者,二者直接关联,耦合在一起,灵活性降低

    发布/订阅模式:订阅者和发布者之间还存在事件中心,它可以是一个消息管道(事件队列),发布者将消息加入管道,管道再把这些消息推向订阅者。观察者和订阅者之间不直接关联,无耦合,但由于事件队列的存在,内存消耗较大

  • 状态模式:定义多个状态类,允许一个对象在其内部状态改变的时候改变它的行为。比如 Context 类是一盏灯,状态类 Weak、Strong、Off 分别可以改变它的状态,这样就可以在状态类中定义一些行为,即修改状态的同时就会执行这些行为

  • 迭代器模式:提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象的内部表示。实例:forEach,$.each(),Iterator

  • 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。比如现有 Color 类和 Shape 类,Shape 类提供 draw 方法,但 draw 方法访问了 Color 类中的属性(即由 Color 类来实现),即 Shape 类中的抽象部分在 Color 类中实现,相当于把 Color 类桥接到了 Shape 类中

  • 组合模式:将对象分为”整体”和”部分”,在”部分”中实现逻辑,在”总体”中把它们组合起来,并且使得对单个对象和组合对象的使用具有一致性(提供同名接口)。比如可以买车票(train 类),可以订房间(hotel 类),也可以买车票同时订房间(total 类,由前两者组合而来),它们都拥有 create方法,其中total 的 create 方法可以分别调用 train 和 hotel 的 create 方法

  • 原型模式:用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。用继承实现,表现在 ES6 上,就是在子类的构造函数中调用 super() 方法,没有特别之处

  • 策略模式:提供多种策略对象,将算法的使用与算法的实现分离开来。它由策略类和环境类组成,环境类接收请求,并委托给某一个策略类

  • 享元模式:将目标对象的状态区分为内部状态和外部状态,内部状态相同的对象可以被共享出来指向同一个内部状态。内部状态如考场和考试用车,外部状态如考生信息。考场和考试用车由于有共同特点,可以引用已经创建好的考场对象和车对象(这些对象称作细粒度对象,可以改进成资源池),从而节约资源

    参考:https://zhuanlan.zhihu.com/p/79819642

  • 模板方法模式:由抽象父类 + 实现子类组成,父类中实现公共方法和封装子类中方法的执行顺序,子类实现这些方法,也可以重写父类的方法

  • 职责链模式:将多个对象连成一条链,并沿着这条链传递请求,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。比如请假审批,需要组长审批、经理审批、总监审批,就需要沿着这条职责链执行

  • 命令模式:封装接收类、命令类(和触发类),命令类收到请求后,通知接收类执行相关的功能,这样做的好处是命令发出者和接受者解耦

  • 备忘录模式:提供了一种可以恢复状态的机制,方便地回到某个历史的状态。设置备忘类、备忘列表,备忘列表中存放备忘类实例对象,提供方法存放存储和恢复历史状态

  • 中介者模式:增加一个中介者对象,所有的相关对象都通过中介者对象来通信,而不是互相引用,使得多对多关系简化为一对多关系