Hi,
ich kenne das State Pattern als Muster mit normalen Klassen ohne Enumeration. Kann man das State Pattern mit einer enum Klasse umsetzen?
Sehe auf den ersten Blick keine Möglichkeit folgendes sementisch gleich als enum zu realisieren
Sowas wäre eine ähnliche Umsetzung, aber ist syntaktisch fehlerhaft:
Kennt jemand eine bessere Umsetzung?
ich kenne das State Pattern als Muster mit normalen Klassen ohne Enumeration. Kann man das State Pattern mit einer enum Klasse umsetzen?
Sehe auf den ersten Blick keine Möglichkeit folgendes sementisch gleich als enum zu realisieren
Java:
public class Test {
public static void main(final String[] args) {
new Test().start();
}
State state = new StateA(this);
private void start() {
state.execute();
}
public void setState(State state) {
this.state = state;
}
}
abstract class State {
protected final Test invoker;
protected State(Test invoker) {
this.invoker = invoker;
}
public abstract void execute();
}
class StateA extends State {
protected StateA(Test invoker) {
super(invoker);
}
@Override
public void execute() {
System.out.println("calcing...");
final int result = 5;
final StateB newState = new StateB(result, invoker);
invoker.setState(newState);
}
}
class StateB extends State {
private final int value;
protected StateB(int result, Test invoker) {
super(invoker);
value = result;
}
@Override
public void execute() {
System.out.println(value);
}
}
Sowas wäre eine ähnliche Umsetzung, aber ist syntaktisch fehlerhaft:
Java:
public class Test {
public static void main(final String[] args) {
new Test().start();
}
State state = State.StateA;
private void start() {
state.execute(this);
}
public void setState(State state) {
this.state = state;
}
}
enum State {
StateA {
@Override
public void execute(Test invoker) {
System.out.println("calcing...");
final int result = 5;
invoker.setState(StateB);
StateB.setValue(result);
}
},
StateB {
private final int result;
public void setValue(int value) {
result = value;
}
@Override
public void execute(Test invoker) {
}
};
public abstract void execute(Test invoker);
}
Kennt jemand eine bessere Umsetzung?
Zuletzt bearbeitet: