1
根据当前连接状态决定在服务器上调用什么方法的良好设计模式是什么?设计模式,基于状态处理消息
假设服务器接收到消息 ,并根据当前状态决定要做什么。
明显的想法是使用一个枚举:
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);
}
看起来比第一个想法干净多了,但也存在问题。枚举不能访问在服务器级别定义的属性和方法。人们必须通过处理所需的所有变量。
有没有更干净的方法来做到这一点,我想避免为此定义额外的公共类?
[策略模式](http://en.wikipedia.org/wiki/Strategy_pattern) –
它更多的[ADT](http://en.wikipedia.org/wiki/Abstract_data_type)那么它是* pattern *,但我会使用[FSM](http://en.wikipedia.org/wiki/Finite-state_machine)。 –