추천 도서: JavaScript Observer Pattern(Classic)
1. 옵저버 패턴이란
옵저버 패턴은 게시-구독 패턴이라고도 합니다. 옵저버 패턴에는 모든 대상을 관리하고 상태가 변경되면 알림을 발행할 수 있는 옵저버가 있습니다. (실제로 SQL Server의 게시와 구독에도 동일한 원칙이 적용됩니다.)
2. 대중적인 설명
예전에 마을 방송이 관찰자였다면 마을 주민 각자가 관찰의 대상이 되었을 것입니다. 마을에 공지사항이 있어 정책이 변경되면 직접 가는 것이 아니라 방송을 통해 소식을 알려야 합니다. 각 집으로 달려가 알림을 보냅니다.
3. 코드
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>观察者模式</title> </head> <body> <script> var observer = {//观察者 villagers: [],//村名 addVillager: function (callback) {//增加村名 this.villagers[this.villagers.length] = callback; }, removeVillager: function (callback) {//移除村名 for (var i = 0; i < this.villagers.length; i++) { if (this.villagers[i] === callback) { delete this.villagers[i]; } } }, publish: function (info) {//发布信息 for (var i = 0; i < this.villagers.length; i++) { if (typeof this.villagers[i] === 'function') { this.villagers[i](info); } } }, make: function (o) {//这里将村子建一个这种广播方式 for (var i in this) { o[i] = this[i]; } } }; var village1 = {}; observer.make(village1);//将村子1建立这种观察者模式 var villager11 = { read: function (what) { console.log('我是第一个村子的第一个村名:' + what); } }; var villager12 = { read: function (what) { console.log('我是第一个村子的第二个村名:'+what); } }; village1.addVillager(villager11.read); village1.addVillager(villager12.read); village1.publish('大家来开会呀!!!'); village1.removeVillager(villager11.read); village1.publish('大家来开会呀!!!'); /* var village2 = { myAddVillager:function(callback){ this.addVillager(callback); }, myRemoveVillager:function(callback){ this.removeVillager(callback); }, myPublish:function(info){ this.publish(info); } }; observer.make(village2);//将村子1建立这种观察者模式 var villager21 = { read: function (what) { console.log('我是第二个村子的第一个村名:' + what); } }; var villager22 = { read: function (what) { console.log('我是第二个村子的第二个村名:'+what); } }; village2.myAddVillager(villager21.read); village2.myAddVillager(villager22.read); village2.myPublish('大家来领猪肉了!!!');*/ </script> </body> </html>
이 글을 작성하면 관찰자 패턴이 구현되었지만 이 패턴이 필요한 마을이 여러 개 있을 수 있으므로 여기서는 관찰자를 생성자로 변환하겠습니다
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>观察者模式</title> </head> <body> <script> function Observer(){//观察者,这里采用构造函数,可以对不同村落进行使用 if(!(this instanceof Observer)){ return new Observer(); } this.villagers = []; }; Observer.prototype = { // villagers: [],//村名 addVillager: function (callback) {//增加村名 this.villagers[this.villagers.length] = callback; }, removeVillager: function (callback) {//移除村名 for (var i = 0; i < this.villagers.length; i++) { if (this.villagers[i] === callback) { delete this.villagers[i]; } } }, publish: function (info) {//发布信息 for (var i = 0; i < this.villagers.length; i++) { if (typeof this.villagers[i] === 'function') { this.villagers[i](info); } } }, make: function (o) {//这里将村子建一个这种广播方式 for (var i in this) { o[i] = this[i]; } } } var village1 = {}; var observer1 = new Observer(); observer1.make(village1);//将村子1建立这种观察者模式 var villager11 = { read: function (what) { console.log('我是第一个村子的第一个村名:' + what); } }; var villager12 = { read: function (what) { console.log('我是第一个村子的第二个村名:'+what); } }; village1.addVillager(villager11.read); village1.addVillager(villager12.read); village1.publish('大家来开会呀!!!'); village1.removeVillager(villager11.read); village1.publish('大家来开会呀!!!'); var village2 = { myAddVillager:function(callback){ this.addVillager(callback); }, myRemoveVillager:function(callback){ this.removeVillager(callback); }, myPublish:function(info){ this.publish(info); } }; var observer2 = new Observer(); observer2.make(village2);//将村子1建立这种观察者模式 var villager21 = { read: function (what) { console.log('我是第二个村子的第一个村名:' + what); } }; var villager22 = { read: function (what) { console.log('我是第二个村子的第二个村名:'+what); } }; village2.myAddVillager(villager21.read); village2.myAddVillager(villager22.read); village2.myPublish('大家来领猪肉了!!!'); </script> </body> </html>
여기서 에디터가 자바스크립트 디자인 패턴의 관찰자 모드를 소개하겠습니다. 도움이 되셨으면 좋겠습니다!