处理事件的设计模式

sky*_*man 6 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; 
       }
}
Run Code Online (Sandbox Code Playgroud)

hvg*_*des 3

好的,您的标题说明了处理事件的模式。如果您正在谈论实际的事件框架,那么您会想到观察者/可观察模式。当您想要触发某种类型的事件,然后让事件处理程序开始处理事件时,这将起作用。

看来您的问题在于命令模式的实现细节。你能发布一些代码来显示你被困在哪里吗?

请注意,模式并不相互排斥,您可以在可观察模式的上下文中使用命令模式。

编辑——根据你的代码,你应该

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

if (type == "type1") return new Command1();
else if (type == "type2") return new Command2();
...
Run Code Online (Sandbox Code Playgroud)

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