2010-06-10 7 views
4

나는 많은 상태가있는 상태 기계가 A--B--C--D--E입니다. 어떤 조건이 확인되면 나는 에서 예를 들어 A으로 많은 전환을합니다. 모든 상태에 대해 나는 abstract 클래스 State을 확장하는 클래스를 가지고 있으며, 모든 메소드를 상태 메소드에 위임하는 관리자가 있습니다. 문제는 "주정부가 직접 관리자 전환 방식을 호출 할 수 있습니까?"입니다. 나는 전환이 얼마나 많이 일어 났는지를 아는 메인 클래스 (예 : insertQuarter(), ejectQuarter(), turnCrank(), dispense())가있는 인터넷에서만 예제를 보았습니다. 이 작업을 수행하는 유일한 방법은 상태에서 관리자 전환 메서드를 호출하는 것입니다. 이 잘못되었거나 나쁜 관행입니까? 사전에상태 디자인 패턴의 전환 방법

감사 Tobia

답변

3

당신은 최대 하나 개의 실행은 다음과 같이 내가 생각하고 모델이며, 시간에 특정 시점에서 이루어지는 간단한 동기 상태 머신을해야하는 경우 :

1) 실행 문맥은 Context 객체로 표현됩니다. 컨텍스트는 상태간에 전달되며 관리자가 흐름을 결정하는 데 사용됩니다. 컨텍스트의 API는 시스템이 필요한 일반적인 방법에 따라 다릅니다.

2) 상태 인터페이스에는 특정 논리가 실행되는 execute (Context) 메소드가 포함됩니다. 컨텍스트 데이터를 사용하고 변경할 수 있습니다.

3) 관리자는 전환 규칙을 사용하여 구성됩니다. 마지막 상태와 컨텍스트를 고려하여 실행할 다음 상태를 결정할 수 있습니다. 초기 상태를 실행하여 시작합니다. 상태 S를 실행할 때마다 상태 S와 연관된 전이 규칙에 대해 컨텍스트 개체를 검사합니다. 터미널 상태에 도달하면 흐름은 끝납니다.

이 디자인에서는 상태 구현이 어떤 방식 으로든 관리자를 인식하지 못하고 라우팅 결정에 관여하지 않습니다.

+0

귀하의 제안에 따라, 주정부는 다음 주를 결정하지 않기 때문에 주정부 패턴이 사용되지 않습니다. 권리? – Matroska

+0

@Matroska : 이해할 수있는 상태 디자인 패턴의 아이디어는 일부 실행 메커니즘에 대한 참조를 저장하고 명령을 위임하는 것입니다. 실행자는 행동 변경이 필요한 언제든지 바꿀 수 있습니다. 필자가 제안한 디자인에서 관리자는 현재 상태에 대한 참조를 저장하고 모든 전환 후에이 참조를 변경하기 때문에 패턴을 사용한다고 생각합니다. –

+0

@Matroska : 내 접근 방식이 Wikiperia의 예와 다른 점에 동의합니다. 그러나, 나는 그것이 상태 기계를 구현하는 더 깨끗한 방법이라고 생각한다. 주정부는 서로에 대해 알 필요가 없습니다. –

0

예 ... 적어도 내 질문을 올바르게 이해했다면. 관리자는 현재 상태에 대한 참조를 유지해야하므로 현재 상태가 이어야합니다. 관리자에게에게 다음 현재 상태로 이동하도록 요청하십시오. 예를 들어 Wikipedia example을보십시오.

+0

관리자에게 현재 상태를 다음 상태로 설정하는 다른 상태로 이동하도록 요청할 수는 있지만 다음 상태를 활성화하는 방법은 무엇입니까? 위키 예제에서는 제 상황이 아닙니다. StateContext.writeName (String name)을 state 중 하나의 writeName 메소드에 넣으면 동일하게됩니다. – Matroska

+0

다음 상태를 '활성화'하지 마십시오. 그것으로 전환하는 것은 관리자 (컨텍스트)에 현재 상태가 NextState임을 알리는 것을 의미합니다. 문맥이 어떤 액션을 할 필요가있을 때, 그것은 그 메소드의 구현과 함께 그것을 상태로 위임한다. – Noich

관련 문제