【问题标题】:Design Pattern, handle messages based on state设计模式,根据状态处理消息
【发布时间】:2014-04-30 15:06:52
【问题描述】:

有哪些好的设计模式可以根据当前连接状态决定在服务器上调用什么方法?

假设服务器接收消息, 并根据当前状态决定要做什么。

显而易见的想法是使用枚举:

enum State{LISTEN, SYN_REC, ESTABLISHED};
State state = State.LISTEN;

void msgReceived(Object msg){
if(state==State.LISTEN){ /* … */ }
     else if(state == State.SYN_REC){ /* … */ }
     else if(state == State.ESTABLISHED){ /* … */ }
}

这是非常丑陋的代码。

下一个想法是让枚举提供一个句柄方法:

enum State {
    LISTEN{ public void handle(Object msg){ /* … */ } },
    SYN_REC{ public void handle(Object msg){ /* … */ } },
    ESTABLISHED{ public void handle(Object msg){ /* … */ } };
    public abstract void handle(Object msg);
};

State state = State.LISTEN;

void msgReceived(Object msg){
    state.handle(msg);
}

看起来比第一个想法干净得多,但也有问题。枚举无权访问在服务器级别定义的属性和方法。必须传入句柄所需的所有变量。

有没有更简洁的方法可以做到这一点,我想避免为此定义额外的公共类?

【问题讨论】:

标签: java design-patterns network-programming network-protocols


【解决方案1】:

这绝对是Strategy pattern。实现这一点的最酷方法是将其与 state pattern 作为枚举配对。

所以,你的例子是正确的。在您的枚举中声明一个抽象方法,然后让每个状态都实现它。返回结果为新状态。

而且,是的,鉴于您在通话之前知道的非常少,您将不得不在通话中传递所有这些信息。

Example of abstract enums

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多