【发布时间】: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