非常典型的情况是,给定的对象需要有许多侦听器。例如,我可能有
class Elephant {
public void addListener( ElephantListener listener ) { ... }
}
但我会有很多这样的情况。也就是说,我也会有一个Tiger带有TigerListeners的对象。现在,TigerListeners 和ElephantListeners 完全不同:
interface TigerListener {
void listenForGrowl( Growl qrowl );
void listenForMeow( Meow meow );
}
尽管
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); }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) { ... } } } }订阅者和发布者之间的关键关系是发布者可以向订阅者发送事件,它不一定可以向订阅者发送某些类型的事件 - 这种类型的重构将逻辑从接口推送到具体实现.