设计模式笔记

60 阅读4分钟

1. 工厂模式

不通过new的方式产生实例对象,而是通过工厂的方法创建实例对象

Factory {
    createProduct(a){
      return new Product(a)
    }
}

2. 单例

通过创建实例的方法创建实例,能获得的实例,都是同一个实例。全局只有一个实例。

3. 适配器模式

将无法在当前场景下使用的对象,通过适配器进行封装,使得该对象能在当前场景下使用。

例如,当前场景下需要调用A方法,但是对象O对应的方法是B,那么需要一个适配器S对O进行封装。 通过调用S的A方法,实现对O的使用。由此,让O成为可用。

S {
  A() {
    O.B()
  }
}

4. 装饰器模式

通过装饰器D,对对象O添加新的方法,  新生成的对象既有O的所有功能,又增加了新的方法。

D(O){
  return {
    newF(){
     console.log(1111)
    },
   // 与O相同的方法
    m(){
      O.m()
    }
  }
}

5. 代理模式

代理P隔离了对象B,只有通过P才能实现对B的访问。通过P实现对B的控制性访问。由此实现在访问B的过程中做一些额外的任务。

A--->P--->B

6. 外观模式

弭平差异,例如不同浏览器、不同操作系统,相同的功能使用了不同的方法。对这些不同的方法进行统一化处理,提供统一的访问方法,就是外观模式。

典型的:jQuery对不同浏览器选择元素、事件绑定的统一处理。

7.  观察者模式 / 发布订阅模式

被观察者/发布者,提供一个方法,添加观察者/订阅者。

在被观察者变化/发布者发布时,触发所有观察者/订阅者的指定方法。

观察者/订阅者,在观察/订阅,被观察者/发布者时调用的方法,会调用 被观察者/发布者的添加方法,将观察者和订阅者,添加进被观察者的观察者列表中/发布者的订阅者列表中。

8.  状态模式

声明好不同状态的方法,不同状态方法调用对象,实现改变对象的属性等的改变。

stateA(o){
    o.setState('a')
}

stateB(o){
    o.setState('b')
}

9. 迭代器

在不暴露对象内部具体的情况下,实现对对象中各个元素的访问

class Iterator {
    constructor(conatiner) {
        this.list = conatiner.list
        this.index = 0
    }
    next() {
        if (this.hasNext()) {
            return this.list[this.index++]
        }
        return null
    }
    hasNext() {
        if (this.index >= this.list.length) {
            return false
        }
        return true
    }
}

class Container {
    constructor(list) {
        this.list = list
    }
    getIterator() {
        return new Iterator(this)
    }
}

10. 桥接模式、组合模式

桥接模式,让抽象和具体分离。

抽象:人 --- 男、女; 技术---java 、js。

桥接:bridge(人,技术) --> 人+技术。 男java, 男js, 女java, 女js

组合模式:部分组成整体

组合: 碗+筷子-->碗筷组合。

组合中的部分是具体的,固定的。 桥接模式中的抽象部分是不固定的,是指向不确定的具体对象。

11.  策略模式

设置好不同的策略,在不同场景下使用

strategies ={
  a(){},
  b(){}
}
fn()  if(a场景){
   strategies.a()
  }
  if(b场景){
    strategies.b()
  }
}

状态模式:  状态主动执行对象

策略模式:策略被动的在不同场景下被调用。

12. 享元模式

通过同一个对象,不同属性的变化,实现对类似多个对象的访问,减少对象创建的开销。

例如学员学车,不同学员只需要一辆车,排队进行练习,而不需要多辆车让学员分别练习。享元模式下,只需要创建一辆练习车,改变不同练习人,即可实现多学员学习。

13. 模版模式

抽象父类提供抽象的模版方法,子类继承父类,实现模版对应的方法。

14. 职责链模式

创建执行链条,实现不同环节依次执行。

class Action {
    constructor(name) {
        this.name = name
        this.nextAction = null
    }
    setNextAction(action) {
        this.nextAction = action
    }
    handle() {
        console.log( `${this.name} 审批`)
        if (this.nextAction != null) {
            this.nextAction.handle()
        }
    }
}

let a1 = new Action("组长")
let a2 = new Action("经理")
let a3 = new Action("总监")
a1.setNextAction(a2)
a2.setNextAction(a3)
a1.handle()

15. 命令模式

命令者不执行操作,通过下达指令,触发执行者执行操作。

A----order--->B

A需要添加能够下达的命令

B需要提供相应的命令。

命令中心接收B生成命令,A将命令存进自己属性中。A下达命令时,触发B执行相关操作。

16. 备忘录模式

存储历史操作记录,通过历史记录进行恢复

17. 中介者

代理模式与中介模式

代理模式,是全权代理。 A -->代理P-->B

P是B的代理,A通过P的代理,实现了对B的访问。

中介模式,A-->中介M-->B; A<--中介M<--B。

中介M是A、B之间沟通的桥梁,A,B通过中介实现相互访问。

18. 访问者模式

O提供一个方法m, 接受一个访问者V。

v的一些方法调用,可以执行O的一些功能。

V{ 
    visit(o){
      this.o=o
    }
    useOLog(){
      this.o.log()
    }
}
O {
   log(){},
   m(v){
     v.visit(this)  
  }
} 

参考:

juejin.cn/post/684490…