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)
}
}
参考: