我经常遇到的情况是,给定的对象需要有许多侦听器。例如,我可能有
class Elephant {
public void addListener( ElephantListener listener ) { ... }
}
但我会遇到很多这样的情况。也就是说,我也会有一个Tiger
对象将会有TigerListener
s。现在,TigerListener
s and ElephantListener
是完全不同的:
interface TigerListener {
void listenForGrowl( Growl qrowl );
void listenForMeow( Meow meow );
}
while
interface ElephantListener {
void listenForStomp( String location, double intensity );
}
我发现我总是必须在每个动物类中不断重新实现广播机制,并且实现总是相同的。有首选模式吗?
而不是每一个Listener
对于您可以发送的每种事件类型都有特定的方法,更改接口以接受通用Event
班级。然后你可以子类化Event
如果需要,可以指定为特定子类型,或者让它包含状态,例如double intensity
.
TigerListener 和 ElephentListener 则变为
interface TigerListener {
void listen(Event event);
}
事实上,你可以进一步将此接口重构为一个简单的Listener
:
interface Listener {
void listen(Event event);
}
Your Listener
然后,实现可以包含他们关心的特定事件所需的逻辑
class TigerListener implements Listener {
@Overrides
void listen(Event event) {
if (event instanceof GrowlEvent) {
//handle growl...
}
else if (event instance of MeowEvent) {
//handle meow
}
//we don't care about any other types of Events
}
}
class ElephentListener {
@Overrides
void listen(Event event) {
if (event instanceof StompEvent) {
StompEvent stomp = (StompEvent) event;
if ("north".equals(stomp.getLocation()) && stomp.getDistance() > 10) {
...
}
}
}
}
订阅者和发布者之间的关键关系是发布者可以向订阅者发送事件,但不一定可以向订阅者发送某些类型的事件 - 这种类型的重构将逻辑从接口向下推送到具体的实现中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)