创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、生成器模式、原型模式 5 种。
结构型模式:用于描述如何将类或对象按某种布局组成更大的结构。包括代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式 7 种。
行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。模板方法、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式 11种。
【工厂模式】:
【抽象工厂模式】:
抽象工厂模式包含如下 4 种角色:抽象工厂、具体工厂、抽象产品、具体产品。
继承同一父类、实现同一接口的子类
对象,由给定的多个类型参数创建具体的对象。如汽车厂商不但能生产 Car,也可以生产发动机 Engine,这就是两个产品等级结构,一个产品族。再下面例子中,如果我们需要新增一个Audi 厂商,我们只需要新增一个具体的AudiFactory工厂和一个具体产品的AudiCar 和 AudiEngine类,然后进行实例化,便可以实现。
【建造者模式】:
【单例模式】:
【原型模式】:
类.prototype
上。
【装饰器模式】:
【组合模式】:
例1、
例2、
【代理模式】:
所谓的的代理模式就是为一个对象找一个替代对象,以便对原对象进行访问。使用代理的原因是我们不愿意或者不想对原对象进行直接操作,我们使用代理就是让它帮原对象进行一系列的操作,等这些东西做完后告诉原对象就行了。
使用场景:给原类添加非功能性需求,为了将代码与原业务解耦;业务系统的非功能性需求开发:监控、统计、鉴权、限流、日志、缓存。
【外观模式】:
【桥接模式】:
【享元模式】:
有个服装厂,生产了男女服装各50种款式,为了推销需要找模特来拍照,正常可能会找男女模特各50个,每个模特分别穿一种服装拍一组照片。但是如果这种,后面款式越来越多,也就意味着模特也越来越多,仔细分析一下,其实不管有多少种类衣服,我们只需要男女各一个模特来穿衣服进行拍照也可实现该需求。
【观察者模式】:
例1、
例2:
售楼处卖房子。很多的想买房子的人来咨询房子的事情,但是现在有些房子还需要等待最终的结果,打算买房子的人就把自己的个人信息都给了售楼处的人,售楼处的人等这些房子有了消息,统一打电话告诉打算房子人他们想要知道的消息,就不用每次都给来一趟售楼处来知道关于当前房子的事。
// 售楼处
var saleOffices = {}
// 保存需要买房的登记的用户(订阅者)
saleOffices.clientList = []
// 根据订阅相同类别的房的订阅者分类保存起来
saleOffices.listen = function (key, fn) {
if (!this.clientList[key]) {
this.clientList[key] = []
}
this.clientList[key].push(fn)
}
// 发布消息给订阅者
saleOffices.trigger = function () {
// [].shift.call(arguments) arguments类数组转化为数组
var key = [].shift.call(arguments)
fns = this.clientList[key]
// 不存在要通知的订阅者
if (!fns || fns.length === 0) {
return false
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments)
}
}
saleOffices.listen('squareMeter88', function (price) {
console.log('价格:' + price);
})
saleOffices.listen('1000ping', function (price) {
console.log('价格:' + price);
})
saleOffices.trigger('squareMeter88', 20000)
saleOffices.trigger('1000ping', 40000)
【策略模式】:
请输入:
例2、
1.公司发奖金,根据不同等级奖金比例也是不同,为了判断每一个人应该根据等级和等级所对应的倍数得到的奖金,写出下面的代码,需要计算的部分封装成了类,Bonus 作为了Context 拥有了执行策略的能力也就是执行这些算法类。
2.定义一系列的算法,把它们各自封装成策略类,算法被封装在策略类内部的方法里。在客户对 Context发起请求的时候,Context总是把请求委托给这些策略对象中间的某一个进行计算。
【迭代器模式】:
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素(遍历集合对象),而又不暴露该对象的内部表示。
使用场景:
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。
// hasNext():判断迭代是否结束,返回Boolean
// next():查找并返回下一个元素
const arr = [1, 'red', false, 3.14]
function Iterator(item) {
this.item = item
this.index = 0
}
Iterator.prototype = {
hasNext: function () {
return this.index < this.item.length
},
next: function () {
return this.item[this.index++]
}
}
const iterator = new Iterator(arr)
while (iterator.hasNext()) {
console.log(iterator.next());
}
// 数字区间进行迭代
function Range(start, end) {
return {
[Symbol.iterator]: function () {
return {
next() {
if (start < end) {
return {
value: start++,
done: false
}
return {
done: true,
value: end
}
}
}
}
}
}
}
for (num of Range(1, 6)) {
console.log(num);
}
【命令模式】:
例子:比如电视它具有开和关的功能,用代码来表示的话就是一个'电视类'有两个方法'开电视,'关电视'。一般执行的时候'电视.开电视',对应上面说的'主要解决来讲'开电视这个行为和开电视这个实现都是电视来做的两者是在一起。
在定义上:这时候遥控器出现了,'开/关电视'的行为请求。可以看做两个命令,并且将这两个命令单独写成对象现在就多了两个对象'开电视' 和'关电视'他们是一组命令,多了个'遥控器'可以调用这些命令,并且把这些命令给了电视,电视依旧还是有'开电视', '关电视'的方法,不过不是直接请求调用而是遥控器间接调用了。
以去饭店吃饭为例,我们只需关心菜单上的菜,而不会必须要知道是那个厨师做的菜,因为服务员会帮我们将菜单上的'指令' 和厨师进行匹配。
【适配器模式】:
百度地图和谷歌地图的渲染:
【职责链模式】:
【模板方法模式】:
【访问者模式】:
【等待者模式】:
【备忘录模式】:
【状态模式】:
状态模式
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context
对象。
通常我们谈到封装,一般都会优先封装对象的行为,而不是对象的状态。但在状态模式中刚好相反,状态模式的关键是把事物的每种状态都封装成单独的类,跟此种状态有关的行为都被封装在这个类的内部,所以 button
被按下的的时候,只需要在上下文中,把这个请求委托给当前的状态对象即可,该状态对象会负责渲染它自身的行为。
有一个电灯,电灯上面只有一个开关。当电灯开着的时候,此时按下开关,电灯会切换到关闭状态;再按一次开关,电灯又将被打开。同一个开关按钮,在不同的状态下,表现出来的行为是不一样的。
【中介者模式】:
【解释器模式】: