我需要实现类来支持能够根据事件类型传递不同类型/数量的数据的自定义事件。例如,
对于事件类型A,我需要传递2个字符串名称。 对于事件类型B,我需要传递3个字符串名称和一个双精度。
我发现了2个设计:
EventObject的扩展,包含所有可能数据的字段和方法(某些事件类型不需要的字段留空)。
// event constructors
public MyEvent(Object source, int type, String a, String b) {}
public MyEvent(Object source, int type, String a, String b, String c, double d) {}
EventObject的扩展,包含EventInfo对象的参数。 EventInfo是更改信息的基类。触发特定事件的方法将传递包含必要更改信息的EventInfo的子类(需要监听器进行向下转换)。
// event constructors
public MyEvent(Object source, int type, EventInfo info) {}
// base class for event info
public class EventInfo {}
实现此目的还有哪些其他设计?各自的优点和缺点是什么?
感谢。
答案 0 :(得分:1)
一种常见的设计是在事件类中包含一个Map来保存参数以及一个字段来显示事件类型。因此,您的事件界面将如下所示:
public interface Event [
public Object getParameter(String key);
public void setParameter(String key, Object parameter);
public String getType();
}
在事件处理程序类中,您可以使用getParameter()和getType()来检索事件的参数和事件类型。
答案 1 :(得分:0)
如果您不介意尝试Scala,那么这就是“案例”类主要用于的内容。您可以将它们定义为:
sealed trait SomeEvent
case class YourEvent( a: String, b: String ) extends SomeEvent
case class YourOtherEvent( a: String, b: String, c: String, d: Double ) extends SomeEvent
然后您可以通过模式匹配在“事件处理器”中使用它们:
class EventProcessor extends Actor with ActorLogging {
def receive = {
case YourEvent( a: String, b: String ) =>
// handle it
case YourOtherEvent( a: String, b: String, c: String, d: Double ) =>
// handle it
case unknown => log.debug( "got an unknown event => " + unknown )
}
}
不确定int type
的含义,但如果是事件的类型,则可以只是一个类型化的类。
Object source
可能类似于source: ActorRef
,您实际上可以回复它,也不需要作为参数传递(如果使用Scala / AKKA,它会创建并保留该引用对你而言):
case YourEvent( a: String, b: String, c: String, d: Double ) =>
// handle it
...
//reply to sender (e.g. source)
sender ! YourReply( ... )
上面的示例使用了AKKA的一小部分,但它没有必要,因为案例类上的模式匹配是内置的Scala功能。
将上述视为以不同方式查看您正在解决的问题。