image.png

观察者(Observer)

观察者和被观察者之间相互依赖,被观察者有所改变后直接广播一条信息给观察者,信息也可以包含一些数据
应用:Vue2.x的响应式源码

  1. // 观察者
  2. class Observe {
  3. update (...params) {
  4. console.log(...params, 'Observe观察者')
  5. }
  6. }
  7. class Observe1 {
  8. update (...params) {
  9. console.log(...params, 'Observe1观察者')
  10. }
  11. }
  12. // 目标
  13. class Target {
  14. constructor () {
  15. this.observers = []
  16. }
  17. add(observer) {
  18. this.observers.push(observer);
  19. }
  20. remove(observer) {
  21. this.observers.filter( ob => ob !== observer);
  22. }
  23. count () {
  24. return this.observers.length
  25. }
  26. get (i) {
  27. return this.observers[i]
  28. }
  29. notify (msg) {
  30. let i = 0;
  31. let len = this.count()
  32. let item
  33. for(; i < len; i++) {
  34. item = this.get(i)
  35. item.update(msg)
  36. }
  37. }
  38. }
  39. let target = new Target
  40. console.log(target)
  41. btn1.onclick = function () {
  42. target.add(new Observe)
  43. target.notify('你好,在吗')
  44. }
  45. btn2.onclick = function () {
  46. target.add(new Observe1)
  47. target.notify('在的')
  48. }

中介者(Mediator)

通过一个中间方,提供订阅/发布两个方法,订阅需要订阅的名称,以及回调函数,发布需要订阅名称以及参数
应用:Vue2.x中的eventBus

  1. // 中介者
  2. let mediator = (function () {
  3. let topics = {};
  4. // 订阅:订阅A组件中的某个方法
  5. let subscribe = function subscribe(topic, callback) {
  6. !topics[topic] ? topics[topic] = [] : null;
  7. topics[topic].push({
  8. context: this,
  9. callback
  10. });
  11. };
  12. // 发布:B组件中到某个阶段,可以通知之前订阅的方法执行
  13. let publish = function publish(topic, ...params) {
  14. if (!topics[topic]) return;
  15. topics[topic].forEach(item => {
  16. let {
  17. callback,
  18. context
  19. } = item;
  20. callback.call(context, ...params);
  21. });
  22. };
  23. return {
  24. subscribe,
  25. publish
  26. };
  27. })();
  28. btn1.onclick = function () {
  29. mediator.subscribe('body', (...params) => {
  30. console.log(...params, '订阅阶段')
  31. })
  32. }
  33. btn2.onclick = function () {
  34. mediator.publish('body', [1,2,3,4])
  35. }

发布订阅(Publish Subscribe)