궁극적 인 목표는 클라이언트가 mainState
으로 구성된 항목을 만들 수있는 StateTransitionTable
을 갖는 것입니다. 그 주 상태 (ArrayList
에 저장 됨)에서 점프. 이 응용 프로그램 인 Script
은 루프에서 실행되며 전환 테이블은 다소 자체적으로 작동해야합니다.메서드 수준에서 선언 된 제네릭 형식을 사용할 수 없습니다. 다른 형식으로 선언 된 제네릭 형식이 필요합니다.
이 경우 enum을 사용하지 마십시오. 그들은 잘 확장되지 않습니다.
각 상태는 Script
및 TransitionTable
인스턴스에 모두 액세스해야합니다. 스크립트는 의무를 수행하는 것이며, 테이블은 인덱스를 사용하여 다음 상태로 전환합니다. 인덱스는 전환이 항목에 추가 된 순서에 따라 다릅니다. 생성 된 첫 번째 항목은 사용 된 첫 번째 항목입니다.
응용 프로그램의 루프에서 현재 항목에 저장된 상태에 액세스해야하며 process
을 호출해야합니다. 현재 스크립트 인스턴스를 전달 Script
전화 <T extends Script> process(T)
: 방법은 currentEntry
에서 mainState
을 잡고와 Script
인스턴스와 현재 테이블 인스턴스를 전달하여 process(T, TransitionTable)
방법을 호출하는
//this method is called repeatedly
public void loop() {
table.process(this);
}
. 주의 프로세스 메서드 내에서 script
매개 변수를 사용하여 스크립트에 대한 정보에 액세스하고 테이블을 사용하여 전환을 수행 할 수 있어야합니다. 나에게 오류를주는 한 문장을 제외하고 나는 모든 것을 순서대로 가졌다.
public interface State<T extends Script> {
void process(T script, TransitionTable table);
}
TransitionTable : 기록을 위해
public class TransitionTable {
private Map<State<?>, StateNode> entries = new HashMap<>();
private StateNode currentNode, startNode;
public <T extends Script> void process(T script) {
currentNode.mainState.process(script, this); //Compile-time error here
}
public StateNode createEntry(State<?> state) {
StateNode node = new StateNode(state);
map.put(state, node);
if(startNode == null)
startNode = currentNode = node;
return node;
}
public void transitionTo(int index) {
State<?> nextState = currentNode.states.get(index);
if(nextState == null)
nextNode = startNode.mainState;
currentNode = entries.get(nextNode);
}
public static final class StateNode {
private ArrayList<State<?>> states = new ArrayList<>;
private State<?> mainState;
public StateNode(State<?> state) {
mainState = state;
}
public StateNode addTransition(State<?> state) {
states.add(state);
return this;
}
}
}
는 process
에 대한 제네릭 형식 선언은 실제 스크립트의 유형의 용도를 허용 싼 해킹입니다. 다른 유형을 입력 할 수 있지만 항상 동일한 유형입니다. 싸구려 핵.
내가 오류는 다음과 같습니다
방법 과정 (캡처 # 4의 StateTransitionTable?) 유형의 국가에서는 인수 (T, StateTransitionTable)
적용되지 않습니다 이 이유에 대한 이유를 이해합니다. 클라이언트가 State
의 유형 매개 변수와 다른 메소드의 유형 매개 변수에 대한 하위 유형을 지정할 가능성이 있습니다. 내가 이해할 수없는 것은 이런 상황에 어떻게 대처해야하는지입니다.
나는 이와 같은 디자인 문제에 대한 태그가 있음을 알고 있지만 이름은 기억이 안납니다. 누군가 그것을 추가 할 수 있다면 그것은 인정 될 것입니다. 관련 정보를 빠뜨린 것 같으면
당신이 물어 보지 않았지만, GoF에서 State 패턴을 사용 해본 적이 있습니까? –
@EricStein 이것은 점프 상태를 지정하는 복잡성이 추가된다는 점을 제외하면 실제로 상태 패턴과 매우 유사합니다. 나는 내가 바꿀 상태에 대한 참조가 없기 때문에'table.changeState (state)'와 같은 것을 사용하여 쉽게 상태를 변경할 수 없다. 그래서'transitionTo' 메소드가 인덱스를 받아들이고, 클라이언트가'addTransition'을 사용하여 액세스 할 수있는 상태를 지정할 수있게했습니다. 내가 현재 상태에서 (반복 할 필요없이) 점프하려는 상태에 액세스 할 수 있다면, 나는 –