单例模式(Singleton Pattern
)
描述:
只对外暴露一个对象
1 | // 只创建一个实例 |
1 | // 每次都创建一个新的实例 |
观察者模式(Observer Pattern
)
真实场景:
以公众号为例,有些人订阅(关注)了某公众号,当公众号发布新的消息时,订阅者就会收到该消息的推送
描述:
定义对象之间的依赖关系,每当对象更改状态时,都会通知所有依赖项
1 | // 观察者 |
发布-订阅模式(Publish/Subscribe Pattern
)
真实场景:
报社将报纸发送给邮局,邮局按照订阅关系将报纸发送给对应的人
描述:
消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者。同样的,订阅者可以订阅一个或多个类别,只接收感兴趣的消息,无需了解哪些发布者
1 | // 订阅者 |
观察者模式 vs 发布-订阅模式
如上图
- 观察者模式中,主体(
Subject
)和观察者(Observer
)是强耦合,有直接的联系,相互知道对方的存在。 - 发布-订阅模式中,主体(
Subject
)和观察者(Observer
)是松耦合,没有直接的联系,是通过“事件通道”(调度中心)建立联系,互相不知道对方存在。
奇葩解释:观察者模式,没中间商赚差价;发布-订阅模式,有中间商赚差价 :laughing:
工厂模式(Factory Pattern
)
1 | class CarA { |
适配器模式(Adapter Pattern
)
真实场景:
现在好多智能手机都去掉了 3.5mm
的耳机孔,取而代之的是 Type-C
接口耳机。但是你还想在新手机中使用 3.5mm
的老式耳机怎么办?
没错,那就需要用适配器,Type-C
转 3.5mm
的适配器。如下图 :laughing::
描述:
可以将其他不兼容的对象包装在适配器中,使它与另一个类兼容
1 | // Type-C 耳机 |
装饰者模式(Decorator Pattern
)
真实场景:
先建一个基础版本的手机,经过再加工对手机进行装饰润色,
描述:
装饰者模式,允许你通过将对象包装在装饰器类的对象中,来动态更改对象在运行时的表现行为
1 | // 基础 car 类 |
外观模式(Facade Pattern
)
真实场景:
如何让手机开机?很简单,“长按电源键”即可开机。实际上手机内部处理了很多逻辑才能实现它。这就是所谓的外观模式,将复杂转为简洁。
例如,开发时常用于浏览器兼容性处理的代码。
描述:
为复杂的子系统提供了简化统一的界面
1 | // DOM 绑定事件的兼容性处理 |
代理模式(Proxy Pattern
)
真实场景:
你可以直接去专卖店买手机(某海外品牌),也可以通过代购帮你买手机(这样价格会便宜些)。让代购买手机这种方式,就是所谓的代理模式。
js
原生也支持代理模式 Proxy
描述:
用一个对象来表示另一个对象的功能
1 | class Phone { |
策略模式(Strategy Pattern
)
真实场景:
商店打折促销,某商品买 1
件原价,2
件 8
折,3
件 7
折
描述:
在代码运行时,根据不同情况切换不同的策略(方法)
1 | // 策略组 |
状态模式(State Pattern
)
描述:
在状态更改时更改类的行为(方法)
1 | class Discount { |
欢迎关注无广告文章公众号:学前端