处理事件的设计模式

时间:2011-06-21 15:09:29

标签: java design-patterns

我试图了解用于处理一系列消息的最合适的(Java)设计模式。每条消息都包含一个“类型”,用于确定如何处理消息中包含的数据。

我一直在考虑Command模式,但正在努力理解特定Command类的角色/相关性。到目前为止,我已经确定接收器将包含实现消息处理方法的代码。具体命令将根据消息类型进行实例化。但是,我不知道应该如何传递实际的消息数据。它是否应该通过具体的命令执行方法调用适当的接收方法传递给接收方构造函数?也许消息数据应该在接收者动作方法调用中传递?

我对所有这些都相当新,所以任何指导都会受到赞赏。

这可能有所帮助:

public interface Command {
    public void execute(String msg);
}

public class AO1Command implements Command {

    Receiver rec = new Receiver();

    public void execute(String msg) {
        rec.admit(msg);
    }
}

public class CommandFactory {

    public protected CommandFactory () { }

    public static Command getInstance(String type)  {

       if (type.equals("A01")) return new A01Command();
       else if (type.equals("A02")) return new A02Command();
       else {
          return null; 
       }
}

3 个答案:

答案 0 :(得分:3)

好的,你的标题说明了处理事件的模式。如果您正在讨论实际的事件框架,那么就会想到Observer / Observable模式。当你想要触发某种类型的事件,然后让事件处理程序接受事件的处理时,这将起作用。

好像你的问题在于命令模式的实现细节。你能发布一些显示你被困的地方的代码吗?

请注意,模式不是互斥的,您可以在Observable模式的上下文中使用命令模式。

编辑 - 根据您的代码,您应该

1)使CommandFactory静止 2)将类型传递给getCommand方法,该方法也应该是静态的 3)你不需要反思,你可以简单地做

if (type == "type1") return new Command1();
else if (type == "type2") return new Command2();
...

我不是说你不能使用反思,我说它过于复杂你想要做的事情。另外,他们这样做的方式将表示消息类型的String绑定到命令类名的实现细节,这似乎是不必要的。

答案 1 :(得分:1)

你走在正确的轨道上。命令模式是概述问题的适当解决方案。

要回答您的问题,您可以让CommandFactory根据数据区分器(在本例中为您的消息中的某些数据)实例化一个适当的Command实例。然后,您将调用Command实例上的方法,并传入您的消息。调用此方法执行(...)是常见的(最佳)练习,但您可以随意调用它。

答案 2 :(得分:0)

你可能想看一下Jakarta Digester项目(处理XML),它有一个SAX实现,这是一个基于事件的API,如这里所解释的http://www.saxproject.org/event.html,这是一个简短的解释但可以作为一个起点。