繁体   English   中英

具有大量相互依存事件的实体的设计模式

[英]Design pattern for entities with lot of inter-dependent events

所以我正在写一个小笔记应用程序。 这是各种实体和事件,通过它们它们必须更新其状态/视图。

| Notebook              | Notes            | Status bar            |
|-----------------------|------------------|-----------------------|
| Note added            | Notebook changed | Notebook changed      |
| Note deleted          | Notebook deleted | Notebook deleted      |
| Note completed        | Notebook added   | Date changed          |
| Hours added / changed | Date changed     | Note added            |
| Date changed          |                  | Note deleted          |
|                       |                  | Note completed        |
|                       |                  | Hours added / changed |
|                       |                  | Date changed          |

我计划使用观察者模式的变体来处理各个实体之间的事件。

                                                     +---------------+
+--------------+                                     |               |
|              |                                     |   Notebook    |
|    Notes     |                                     |               |
|              |                                     +-------+-------+
+--------------+                                             |
               |              +--------------+               |
               |              |              |               |
               +-------------->  Mediator    <---------------+
                              |              |
                              +-------^------+
                                      |
                                      |
     +----------------+               |
     |                |               |
     |  Status bar    +---------------+
     |                |
     +----------------+

调解员将接收所有事件,然后将它们传递给该事件的适当订阅者。

让我们举个例子-用户更新笔记并标记为完成,在这种情况下,必须执行以下操作:

  1. 笔记本中已完成笔记的数量应更改。
  2. 状态栏中已完成注释的数量应更改。

让我们以上述示例为例,看看一些代码来演示我正在尝试做的事情-

调解员

'use strict';

class Mediator {
  constructor () {
    this._list = {};
  }

  subscribe (eventName, cb) {
    if (!this._list[eventName]) {
      this._list[eventName] = [];
    }

    this._list[eventName].push(cb);
  };

  trigger (eventName, data) {
    let subscribers = this._list[eventName] || [];
    for (let i = 0, len = subscribers.length; i < len; ++i) {
      let currSubscriber = subscribers[i];
      if (Array.isArray(data)) {
        currSubscriber.apply(null, data);
      } else {
        currSubscriber(data);
      }
    }
  }
}

module.exports = Mediator;

笔记本

this.mediator.subscribe('evt.note.completed', this.noteCompleted);

状态栏

this.mediator.subscribe('evt.note.completed', this.noteCompleted);

注意

this.mediator.trigger('evt.note.completed', note); 

这是观察者模式的变化吗? 有没有比这更好的模式来处理我的用例了?

实际上,这实际上是在重新设计磁通架构

在流量架构中, NotesNotebookStatusbar是视图控制器(在此步骤中充当Controller ),它们从用户或Web API接收事件(或Actions ),并将其传播到Mediator ,在Mediator中称为。 Dispatcher 然后,将事件调度到已订阅的Stores (就像MVC体系结构中的Model一样)。 Stores更新其state ,然后重新渲染绑定到Stores的View-Controller(充当View )。 在更新他们的视图时,他们可能会或可能不会分派另一个Action ,然后再周期性地将其DispatcherDispatcher React中 ,它是一种通量架构的实现,视图控制器被实现为组件。

下图是说明上述流程的图:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM