현재 연결 상태를 기반으로 서버에서 호출 할 메서드를 결정하는 좋은 디자인 패턴은 무엇입니까?디자인 패턴, 상태에 따라 메시지 처리
서버가 메시지를 받고 현재 상태에 따라 처리 방법을 결정해야한다고 가정 해 봅시다.
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);
}
가 처음 생각보다 훨씬 청소기 보인다, 또한 문제가있다 :
다음 생각은 열거가 핸들 방법을 제공하는 것이었다. 열거 형은 서버 수준에서 정의 된 특성 및 메서드에 액세스 할 수 없습니다. 하나는 핸들에 필요한 모든 변수를 전달해야합니다.
이 작업을 수행하는 데 더 깨끗한 방법이 있습니까? 추가 공용 클래스를 정의하지 않아도됩니까?
[Strategy 패턴 (http://en.wikipedia.org/wiki/Strategy_pattern) –
그것의 더이 [ADT (http://en.wikipedia.org/wiki/Abstract_data_type) 다음은 * 패턴 *이지만 [FSM] (http://en.wikipedia.org/wiki/Finite-state_machine)을 사용합니다. –