Postaram się wyjaśnić mój problem dotyczący samochodów. Mam AbstractCar, a użytkownicy (twórcy) mojej biblioteki utworzą wiele swoich ConcreteCars. Ten AbstractCar ma stan i ten stan jest bardzo ważny dla prawidłowego działania biblioteki! Tylko samochód może kontrolować swój stan (brak kierowców itp.). Zmiany stanu metod rozpoczynają/kończą się na początku i na końcu metod. Poza tym wszystkie samochody muszą implementować interfejs samochodowy.Java: Wzór do pracy ze stanem i dziedziczeniem
Próbowałem dwa warianty.
Wariant 1
public abstract class AbstractCar implements Car{
private State state;
public void setState(State state){...}
public State getState(){...}
}
public class ConcreteCar extends AbstractCar{
@Override
public void start(){
setState(stateK);
...
setState(stateN);
}
@Override
public void stop(){
setState(stateR);
...
setState(stateO);
}
}
W wariancie 1 użytkownik biblioteki będą musieli pamiętać, aby zmienić stan. Jeśli zapomni to zrobić, pojawi się błąd w kodzie.
Wariant 2
public abstract class AbstractCar implements Car{
private State state;
protected void doOnStart(){ }
protected void doOnStop(){ }
public final void start(){
state=...;
doOnStart();
state=...;
}
public final void stop(){
state=...;
doOnStop();
state=...;
}
}
public class ConcreteCar extends AbstractCar{
@Override
protected void doOnStart(){
....
}
@Override
protected void doOnStop(){
...
}
}
W wariancie 2 użytkownik nie może zapomnieć o stanie, ponieważ jest już poza jego kontrolą, ale jeśli mam wiele stanów i wiele metod, w których mogą być zmieniane w tym nie jest bardzo dobrym sposobem.
Czy ktoś mógłby doradzić jakikolwiek wzór lub technologie, jak rozwiązać ten problem?
wariant 2 jest metoda wzorca Template: https://en.wikipedia.org/wiki/Template_method_pattern –
@ cricket_007 właśnie przeczytałem o strukturze państwa, jak Rozumiem, że pozwala to samochodowi na zmianę zachowania w zależności od stanu. Ale nie potrzebuję innego zachowania. Muszę tylko kontrolować stan. –
Pewnie. Z twojego psudeokodu, wydaje się, że masz coś w rodzaju uruchamiania, uruchamiania, zatrzymywania i zatrzymywania stanów? –