[英]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 +---------------+
| |
+----------------+
调解员将接收所有事件,然后将它们传递给该事件的适当订阅者。
让我们举个例子-用户更新笔记并标记为完成,在这种情况下,必须执行以下操作:
让我们以上述示例为例,看看一些代码来演示我正在尝试做的事情-
'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);
这是观察者模式的变化吗? 有没有比这更好的模式来处理我的用例了?
在流量架构中, Notes
, Notebook
和Statusbar
是视图控制器(在此步骤中充当Controller
),它们从用户或Web API接收事件(或Actions
),并将其传播到Mediator
,在Mediator
中称为。 Dispatcher
。 然后,将事件调度到已订阅的Stores
(就像MVC体系结构中的Model
一样)。 Stores
更新其state
,然后重新渲染绑定到Stores
的View-Controller(充当View
)。 在更新他们的视图时,他们可能会或可能不会分派另一个Action
,然后再周期性地将其Dispatcher
到Dispatcher
。 在React中 ,它是一种通量架构的实现,视图控制器被实现为组件。
下图是说明上述流程的图:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.