gpt4 book ai didi

java - 设计模式,基于状态处理消息

转载 作者:行者123 更新时间:2023-11-29 05:24:05 25 4
gpt4 key购买 nike

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

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

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

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);
}

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

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

最佳答案

这绝对是一个 Strategy pattern .实现它的一种很酷的方法是将它与 state pattern 配对。作为枚举。

因此,您的示例是在正确的轨道上。在枚举中声明一个抽象方法,然后让每个状态实现它。返回结果为新状态。

而且,是的,鉴于您在通话时间之前知道的很少,您必须在通话中传递所有这些信息。

Example of abstract enums

关于java - 设计模式,基于状态处理消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com