策略模式、装饰器模式、适配器模式、发布订阅模式
设计模式是解决某个特定场景下对某种问题的解决方案
(因此,当我们遇到合适的场景时,我们可能会条件反射一样自然而然想到符合这种场景的设计模式。)
为什么会有设计模式?
就还是上边的 🌰,鲁迅先生说过 : “希望是本无所谓有,无所谓无的。这正如地上的路;其实地上本没有路,走的人多了,也便成了路”,
设计模式是前辈们针对开发中遇到的问题,提出大家公认且有效的解决方案。
为什么需要设计模式?
在我们遇到相似的问题、场景时,能快速找到更优的方式解决
设计模式的核心操作是去观察你整个逻辑里面的变与不变,然后将变与不变分离,达到使变化的部分灵活、不变的地方稳定的目的。
开闭原则,在面向对象编程领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
如何实现一个事件的发布订阅
(例子是国盛通CMS的列表监听)
总结下来发布订阅模式有以下特点:
- 解决了“回调地狱”
- 将多个模块进行了解耦,自己执行时,不需要知道另一个模块的存在,只需要关心发布出来的事件就行
- 因为多个模块可以不知道对方的存在,自己关心的事件可能是一个很遥远的旮旯发布出来的,也不能通过代码跳转直接找到发布事件的地方,debug的时候可能会有点困难。
这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑。事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在。数据通过消息的方式可以灵活的传递。 ——《深入浅出Nodejs》
class Observe {
constructor() {
this.events = {};
}
subscribe(key, fn) {
if (!this.events[key]) {
this.events[key] = [];
}
this.events[key].push(fn);
}
unSubscribe(key) {
for (let k in this.events) {
if (k === key) {
delete this.events[key];
}
}
}
publish(key, value) {
if (this.events[key] && this.events[key].length) {
const fns = this.events[key];
for (let i = 0; i < fns.length; i++) {
fns[i].call(this, value);
}
}
}
}