观察者模式又叫发布订阅模式,是一种常见的设计模式。通过该模式,一个对象(被观察者)维护一个观察者列表,当被观察者状态改变时,它会自动通知观察者,并且观察者会自动更新状态。这种方式可以有效地降低对象之间的耦合性,并且让对象之间的关系更加灵活。
好了,以上是书上说的东西,看不懂对不?我也看不懂(为此看了很久),下面举个例子,翻译成人话 感谢知乎的 ”daisy“,原文出自zhuanlan.zhihu.com/p/88648401
什么是观察者模式?它分为注册环节跟发布环节。
比如我去买芝士蛋糕,但是店家还没有做出来。这时候我又不想在店外面傻傻等,我就需要隔一段时间来回来问问蛋糕做好没,对于我来说是很麻烦的事情,说不定我就懒得买了。
店家肯定想要做生意,不想流失我这个吃货客户。于是,在蛋糕没有做好的这段时间,有客户来,他们就让客户把自己的电话留下,这就是观察者模式中的注册环节。然后蛋糕做好之后,一次性通知所有记录了的客户,这就是观察者的发布环节。
这段解释我很喜欢,虽然描述的不够精准,但是大差不差了。
来解释下
发布订阅者模式分为两个部分
1.蛋糕店(发布者也叫被观察者)
2.顾客(订阅者也叫观察者)
蛋糕店(发布者,被观察者)需要维护(CURD,增删改查晓得不)一个顾客(观察者)列表,当蛋糕店(被观察者)蛋糕做好了(状态改变时),它会自动通知顾客(观察者)
这样是不是一眼就明白了
来上代码这是被观察者部分
// 定义蛋糕店(被观察者对象)
class CakeShop {
constructor() {
this.customers = []; // 存储观察者列表
}
//新增一个顾客(观察者对象),你可以理解为下单了
add(customer) {
this.customers.push(customer); // 添加观察者到列表中
}
//取消一个顾客(观察者对象),你可以理解为退款了
remove(customer) {
const index = this.customers.indexOf(customer);
if (index !== -1) {
this.customers.splice(index, 1); // 从列表中删除观察者
}
}
//通知
notify() {
// 循环观察者列表,通知所有观察者
this.customers.forEach(customer => {
customer.update();
});
}
// 蛋糕熟了改变对象状态,并且通知观察者
changeState(newState) {
this.state = newState;
this.notify();
}
}
再定义一个观察者
// 定义观察者对象
class Customer {
constructor(name) {
this.name = name;
}
update() {
console.log(this.name + " 您的蛋糕已经做好了");
}
}
再调用起来
// 创建被观察者对象
const cShop = new CakeShop();
// 创建观察者对象
const customer1 = new Customer("胡汉三");
const customer2 = new Customer("花木兰");
// 添加观察者
cShop.add(customer1);
cShop.add(customer2);
// 改变对象状态,并触发通知
cShop.changeState("出锅了");
// 胡汉三 您的蛋糕已经做好了
// 花木兰 您的蛋糕已经做好了
观察者模式是一种设计模式,它定义了一种对象间的一对多关系,使得当一个对象改变状态时,所有依赖于它的对象都会自动收到通知并更新。在软件开发中,观察者模式通常用于实现事件处理、消息传递和数据监视等功能。具体来说,在以下情况下可以考虑使用观察者模式:
- 当需要将一个对象的状态变化通知给其他多个对象时,可以使用观察者模式。例如,当一个图形界面控件的值发生改变时,需要及时更新其他相关控件的显示。
- 当一个对象的状态变化可能导致其他多个对象的状态也要随之改变时,可以使用观察者模式。例如,当一个股票价格变化时,需要将这个信息通知给所有订阅该股票的用户。
- 当需要将对象与其观察者解耦合时,可以使用观察者模式。通过采用观察者模式,可以避免对象之间直接调用,从而提高代码的可维护性和灵活性。
总之,观察者模式适用于一些场景,其中一个对象的状态变化需要通知给其他多个对象,并且这些对象之间需要松耦合的情况。
所以这也是说为什么这个举例不是那么恰当。但大致的意思没错