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:

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Podobne wpisy:

Leave a Reply