什么是Observer(观察者)模式?
观察者模式在javascript中应用的比较广泛,流行的jQuery库中的event,eventHandler就是一个典型的观察着模式:一对多的依赖关系,一个subject(目标)如果发生了改变,它的observers(观察者)会被通知,并且状态也会更新

都有哪些角色?
subject (目标) (下面例子中的Click)
主要的职责有:
1 维护观察者列表
2 实现subscribe(订阅)和unsubscribe(取消订阅)接口,就是成为subject的观察者,或从观察列表中退出
3 当自己的状态改变时,通知观察者
Objserver(观察着)(下面例子中的clickHandler)
有一个函数签名,当subject变化时调用
例子:
- 'use strict';
-
- // Click对象相当于Subject目标
-
- function Click() {
- this.handlers = []; //observers
- }
-
- // 观察者订阅
- Click.prototype.subscribe = function (fn) {
- this.handlers.push(fn);
- }
-
- // 观察者取消订阅
- Click.prototype.unsubscribe = function (fn) {
- this.handlers = this.handlers.filter((item)=>{
- if(item !== fn){
- return item;
- }
- });
- }
-
- // 发送通知,状态改变了
- Click.prototype.fire = function (o,thisObj) {
- let scope = thisObj;
- this.handlers.forEach((item)=> {
- item.call(scope,o);
- })
- }
-
- var log = (function() {
- var log = "";
-
- return {
- add: function(msg) { log += msg + "\n"; },
- show: function() { console.log(log); log = ""; }
- }
- })();
-
-
- function run() {
-
- // clickHandler是订阅的观察者
- var clickHandler = function (item) {
- log.add(`fired:${item}`);
- }
-
- var click = new Click();
- click.subscribe(clickHandler);
- click.fire('event #1');
- click.unsubscribe(clickHandler);
- click.fire('event #2');
- click.subscribe(clickHandler);
- click.fire('event #3');
-
- log.show();
-
- }
-
- run();
参考资料:http://www.dofactory.com/javascript/observer-design-pattern



