观察者模式与发布订阅模式的区别:发布订阅模式有个事件调度中心
    (十五)观察者模式 - 图1

    1. // 定义一个被观察者
    2. var observed = (function () {
    3. var observers = []; // 存放所有观察者的列表
    4. var id = 0; // 标记观察者
    5. var _val = null;
    6. return {
    7. // 被观察的变量
    8. get val() {
    9. return _val;
    10. },
    11. set val(value) {
    12. _val = value
    13. this.notify();
    14. return true;
    15. },
    16. // 添加观察者
    17. addObserver: function (observer) {
    18. if (observers.indexOf(observer) !== -1) return;
    19. observers.id = id++;
    20. observers.push(observer);
    21. },
    22. // 删除观察者
    23. removeObserver: function (observer) {
    24. observers = observers.filter(function (o) {
    25. return o.id !== observer.id
    26. });
    27. },
    28. // 通知所有的观察者
    29. notify() {
    30. observers.forEach(function (observer) {
    31. observer.update(_val);
    32. })
    33. }
    34. }
    35. })();
    36. // 定义一个观察者类
    37. function Observer(fn) {
    38. this.update = function (value) {
    39. fn(value);
    40. };
    41. }
    42. const observer1 = new Observer((a) => { console.log('o1', a) });
    43. const observer2 = new Observer((a) => { console.log('o2', a) });
    44. observed.addObserver(observer1);
    45. observed.addObserver(observer2);
    46. observed.val = 55; // 控制台打印出 o1 55 和 o2 55