Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
QZero_0
java-design-patterns
提交
c66ca672
J
java-design-patterns
项目概览
QZero_0
/
java-design-patterns
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
java-design-patterns
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
c66ca672
编写于
1月 06, 2022
作者:
I
Ilkka Seppälä
提交者:
GitHub
1月 06, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#590 add explanation for event aggregator (#1936)
上级
2679f7aa
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
139 addition
and
1 deletion
+139
-1
event-aggregator/README.md
event-aggregator/README.md
+139
-1
未找到文件。
event-aggregator/README.md
浏览文件 @
c66ca672
...
...
@@ -9,6 +9,10 @@ tags:
-
Reactive
---
## Name
Event Aggregator
## Intent
A system with lots of objects can lead to complexities when a
client wants to subscribe to events. The client has to find and register for
...
...
@@ -17,6 +21,136 @@ requires a separate subscription. An Event Aggregator acts as a single source
of events for many objects. It registers for all the events of the many objects
allowing clients to register with just the aggregator.
## Explanation
Real-world example
> King Joffrey sits on the iron throne and rules the seven kingdoms of Westeros. He receives most
> of his critical information from King's Hand, the second in command. King's hand has many
> close advisors himself, feeding him with relevant information about events occurring in the
> kingdom.
In Plain Words
> Event Aggregator is an event mediator that collects events from multiple sources and delivers
> them to registered observers.
**Programmatic Example**
In our programmatic example, we demonstrate the implementation of an event aggregator pattern. Some of
the objects are event listeners, some are event emitters, and the event aggregator does both.
```
java
public
interface
EventObserver
{
void
onEvent
(
Event
e
);
}
public
abstract
class
EventEmitter
{
private
final
Map
<
Event
,
List
<
EventObserver
>>
observerLists
;
public
EventEmitter
()
{
observerLists
=
new
HashMap
<>();
}
public
final
void
registerObserver
(
EventObserver
obs
,
Event
e
)
{
...
}
protected
void
notifyObservers
(
Event
e
)
{
...
}
}
```
`KingJoffrey`
is listening to events from
`KingsHand`
.
```
java
@Slf4j
public
class
KingJoffrey
implements
EventObserver
{
@Override
public
void
onEvent
(
Event
e
)
{
LOGGER
.
info
(
"Received event from the King's Hand: {}"
,
e
.
toString
());
}
}
```
`KingsHand`
is listening to events from his subordinates
`LordBaelish`
,
`LordVarys`
, and
`Scout`
.
Whatever he hears from them, he delivers to
`KingJoffrey`
.
```
java
public
class
KingsHand
extends
EventEmitter
implements
EventObserver
{
public
KingsHand
()
{
}
public
KingsHand
(
EventObserver
obs
,
Event
e
)
{
super
(
obs
,
e
);
}
@Override
public
void
onEvent
(
Event
e
)
{
notifyObservers
(
e
);
}
}
```
For example,
`LordVarys`
finds a traitor every Sunday and notifies the
`KingsHand`
.
```
java
@Slf4j
public
class
LordVarys
extends
EventEmitter
implements
EventObserver
{
@Override
public
void
timePasses
(
Weekday
day
)
{
if
(
day
==
Weekday
.
SATURDAY
)
{
notifyObservers
(
Event
.
TRAITOR_DETECTED
);
}
}
}
```
The following snippet demonstrates how the objects are constructed and wired together.
```
java
var
kingJoffrey
=
new
KingJoffrey
();
var
kingsHand
=
new
KingsHand
();
kingsHand
.
registerObserver
(
kingJoffrey
,
Event
.
TRAITOR_DETECTED
);
kingsHand
.
registerObserver
(
kingJoffrey
,
Event
.
STARK_SIGHTED
);
kingsHand
.
registerObserver
(
kingJoffrey
,
Event
.
WARSHIPS_APPROACHING
);
kingsHand
.
registerObserver
(
kingJoffrey
,
Event
.
WHITE_WALKERS_SIGHTED
);
var
varys
=
new
LordVarys
();
varys
.
registerObserver
(
kingsHand
,
Event
.
TRAITOR_DETECTED
);
varys
.
registerObserver
(
kingsHand
,
Event
.
WHITE_WALKERS_SIGHTED
);
var
scout
=
new
Scout
();
scout
.
registerObserver
(
kingsHand
,
Event
.
WARSHIPS_APPROACHING
);
scout
.
registerObserver
(
varys
,
Event
.
WHITE_WALKERS_SIGHTED
);
var
baelish
=
new
LordBaelish
(
kingsHand
,
Event
.
STARK_SIGHTED
);
var
emitters
=
List
.
of
(
kingsHand
,
baelish
,
varys
,
scout
);
Arrays
.
stream
(
Weekday
.
values
())
.<
Consumer
<?
super
EventEmitter
>>
map
(
day
->
emitter
->
emitter
.
timePasses
(
day
))
.
forEachOrdered
(
emitters:
:
forEach
);
```
The console output after running the example.
```
18:21:52.955 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Warships approaching
18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: White walkers sighted
18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Stark sighted
18:21:52.960 [main] INFO com.iluwatar.event.aggregator.KingJoffrey - Received event from the King's Hand: Traitor detected
```
## Class diagram
![
alt text
](
./etc/classes.png
"Event Aggregator"
)
...
...
@@ -26,9 +160,13 @@ Use the Event Aggregator pattern when
*
Event Aggregator is a good choice when you have lots of objects that are
potential event sources. Rather than have the observer deal with registering
with them all, you can centralize the registration logic to the Event
Aggregator. As well as simplifying registration, a Event Aggregator also
Aggregator. As well as simplifying registration, a
n
Event Aggregator also
simplifies the memory management issues in using observers.
## Related patterns
*
[
Observer
](
https://java-design-patterns.com/patterns/observer/
)
## Credits
*
[
Martin Fowler - Event Aggregator
](
http://martinfowler.com/eaaDev/EventAggregator.html
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录