观察者模式,其实指的就是,一对多的解释。一个对象发生改变,对应的多个订阅者都需要发生对应改变,这种多个对象观察一个对象的区别就是观察者模式。
举例子说明:
一个办公楼。不知道有多少个公司,但是他们都有一个物业群,这个群物业会通知一些疫情相关情况。物业会在群里通知办公楼的封锁情况,而各个公司的负责人则需要在群里随时观察是不是有情况,从而做出改变。同时这个群的所有者(物业)也会用有拉人入群,发送公告,清人出群的权限。
首先,你必须有一个对象为观察者。也就是说,例子中办公楼的这些公司。属于观察者。在观察某种情况,当这种情况出现后,可以改变自己的一些状态或者操作。
其次,有一个对象为主体,我们也可以叫他为通知者,也就是说,这个主体需要在被观察者的状态改变后,用来通知观察者们。这个可以是例子中的物业群。
最后,需要有一个对象为被观察者,也就是说,在某种特定状态改变后(被主体对象检测到),例如:例子中 物业群公告。
所以,我们可以以例子1为例,写一个代码实现自己的观察者模式。
// 物业群 class PropertyGroup { constructor() { // 初始化公告 this.state = '正常运作' // 初始化公司列表 this.companyList = [] } // 添加公司(添加观察者) add (com) { this.companyList.push(com) } // 移除群聊 remove (com){ this.companyList.forEach((item,index) => { if(item == com){ this.companyList.splice(index,1) return } }) } // 设置状态 setState(val) { this.state = val this.notify() } // 发送通知 notify(){ this.companyList.forEach((item) =>{ if(this.state == '关闭办公楼'){ item.Close() } }) } } // 个人公司 class Company { constructor(name){ this.name = name } Close(){ console.log(this.name + '公司,关闭') } } // 测试 const com1 = new Company("科技公司") const com2 = new Company("生物公司") const com3 = new Company("传媒公司") // 物业拉群 const pro = new PropertyGroup() pro.add(com1) pro.add(com2) pro.add(com3) // 物业设置状态 pro.setState("关闭办公楼")
控制台上打印如上。
至此我们的观察订阅者demo就实现完成了。
物业群拥有拉入公司,移除公司,发送公告等操作。
而观察者(公司)仅仅是在物业群有公告发出的时候,根据公告自身,自己做出响应。
而这就是我们的观察者模式。