1

我需要实现类来支持能够根据事件类型传递不同类型/数量的数据的自定义事件。例如,

使用事件类型 AI 需要传递 2 个字符串名称。使用事件类型 BI 需要传递 3 个字符串名称和一个双精度。

我发现的 2 个设计:

  1. 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) {}
    
  2. EventObject 的扩展,包含 EventInfo 对象的参数。EventInfo 是更改信息的基类。触发特定事件的方法将传递 EventInfo 的子类,其中包含必要的更改信息(侦听器需要向下转换)。

    // event constructors
    public MyEvent(Object source, int type, EventInfo info) {}
    
    // base class for event info
    public class EventInfo {}
    

有哪些其他设计可以实现这一点?各自的优缺点是什么?

谢谢。

4

2 回答 2

1

一种常见的设计是在您的事件类中包含一个 Map 以保留参数以及显示事件类型的字段。因此,您的事件界面将如下所示:

public interface Event [
    public Object getParameter(String key);
    public void setParameter(String key, Object parameter);
    public String getType();
}

在您的事件处理程序类中,您可以使用 getParameter() 和 getType() 来检索事件的参数和事件类型。

于 2012-04-06T16:31:52.927 回答
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,但如果那是事件的类型,它可以只是一个类型化的类。

AnObject 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 的内置功能。

将上述内容视为看待您正在解决的问题的另一种方式。

于 2012-04-06T16:44:47.993 回答