Wzorce projektowe: State
Wzorzec State jest wzorcem operacyjnym, który posiada wiele implementacji i może się przełączać pomiędzy nimi podczas działania programu. Zmiana może być spowodowana interakcją użytkownika lub też automatycznie przez klasę kliencką jako odpowiedź na wykonaną akcję. Korzystanie z wzorca eliminuje wiele instrukcji warunkowych z kodu, które uzależnieją wykonane operacji od odpowiedniego warunku. W state takie warunki przeniesione są do oddzielnych klas.
Spójrzmy na kod:
1 public class BadStateKlas { 2 private boolean warunek = true; 3 4 public static void main(String[] args) { 5 BadStateKlas bad = new BadStateKlas(); 6 } 7 8 public BadStateKlas() { 9 10 metoda1(); 11 metoda2(); 12 13 } 14 15 private void metoda1() { 16 //kod wykonujemy gdy wartość pola 'warunek' jest = true 17 if (warunek) { 18 System.out.println("Wykonuję metodę 1"); 19 } else { 20 System.out.println("Nie wykonuję metody 1"); 21 } 22 } 23 24 private void metoda2() { 25 // kod wykonujemy gdy wartość pola 'warunek' jest = false 26 if (!warunek) { 27 System.out.println("Wykonuję metodę 2"); 28 } else { 29 System.out.println("Nie wykonuję metody 2"); 30 } 31 } 32 } 33
Kod wykonywany w metodach 1 i 2 jest zależny od wartości pola ‘warunek’. A co jeżeli będę trzy możliwości? Pole warunek trzeba będzie zmienić z boolean na int lub Enum, a listy ‘ifów’ będą coraz dłuższe. Zamiast tego ustawimy pole stan dla klasy, a kod zależny od tego pola umieścimy w zewnętrznych klasach.
Interfejs:
1 public interface Warunek { 2 public void metoda1(); 3 4 public void metoda2(); 5 } 6
Poszczególne stany:
1 public class Warunek1 implements Warunek{ 2 public void metoda1() { 3 System.out.println("Wykonuję metodę 1"); 4 } 5 6 public void metoda2() { 7 System.out.println("Nie wykonuję metody 2"); 8 } 9 } 10
1 public class Warunek2 implements Warunek{ 2 public void metoda1() { 3 System.out.println("Nie wykonuję metody 1"); 4 } 5 6 public void metoda2() { 7 System.out.println("Wykonuję metodę 2"); 8 } 9 } 10
klasa klienta:
1 public class GoodState { 2 private Warunek warunek; 3 4 public GoodState(Warunek warunek) { 5 this.warunek = warunek; 6 7 warunek.metoda1(); 8 warunek.metoda2(); 9 10 } 11 12 public void setWarunek(Warunek warunek) { 13 this.warunek = warunek; 14 } 15 16 public static void main(String[] args) { 17 GoodState state = new GoodState(new Warunek1()); 18 } 19 } 20
Diagram wzorca:







