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

가 처음 생각보다 훨씬 청소기 보인다, 또한 문제가있다 :

다음 생각은 열거가 핸들 방법을 제공하는 것이었다. 열거 형은 서버 수준에서 정의 된 특성 및 메서드에 액세스 할 수 없습니다. 하나는 핸들에 필요한 모든 변수를 전달해야합니다.

이 작업을 수행하는 데 더 깨끗한 방법이 있습니까? 추가 공용 클래스를 정의하지 않아도됩니까?

+0

[Strategy 패턴 (http://en.wikipedia.org/wiki/Strategy_pattern) –

+0

그것의 더이 [ADT (http://en.wikipedia.org/wiki/Abstract_data_type) 다음은 * 패턴 *이지만 [FSM] (http://en.wikipedia.org/wiki/Finite-state_machine)을 사용합니다. –

답변

3

이것은 확실히 Strategy pattern입니다. 당신이 구현할 수있는 멋진 방법은 enum으로 state pattern과 페어링하는 것입니다.

예를 들어 귀하의 예를 올바른 트랙에 있습니다. 열거 형에 추상 메소드를 선언하고 모든 상태로 구현하십시오. 반환 결과가 새로운 상태가됩니다.

그리고 예, 통화 시간 전까지는 전화에서이 모든 정보를 전달해야합니다.

Example of abstract enums