I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Stan (state) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec Stan (state) jak sama nazwa wskazuje, jest używany gdy musimy reprezentować stan w aplikacji.
Wzorzec stanu oznacza, że chcesz zlokalizować zachowanie specyficzne dla stanu.
Mówiąc dokładniej, wzorzec State sprawia, że bieżący stan aplikacji jest przechowywany w obiekcie,
a nie w mieszance zmiennych w całej aplikacji.
Wzorzec stanu pomaga nam również oddzielić stan, w którym się znajdujemy,
od tego, w jakim jesteśmy w naszej aplikacji.
2. Problem:
Chcemy mieć różne stany aplikacji, chcemy wyeliminować if else do uzyskiwania stanu aplikacji.
Block if else wraz z rozrastaniem aplikacji jest trudny w utrzymaniu, chcemy uprościć złożoność klasy.

3. Rozwiązanie:
Wzorzec stan jest implementowany jako interface lub klasa abstrakcyjna.
Reprezentowana jest przez klasę per każdy stan.
Zamiast przechodzić przez różne przypadki emiminujemy if else block, raz zaimplementując wzorzec
który jest uzewnętrzniony do każdego warunku będący klasą Stanu.
Klasa reprezentująca stan ma informację tylko o następnym stanie.
Upraszcza cykliczną złożoność, usuwając w ten sposób bloki kodu spaghetti,
które mamy wewnątrz naszej aplikacji.
To sprawia, że dodawanie kolejnych stanów jest znacznie łatwiejsze,
zamiast przechodzenia przez każdy blok if else w naszej aplikacji,
możemy po prostu dodać klasę i zmienić stan przed nią, aby wskazywał na tę.

4. Diagram klas wzorca Stan (state):


5. Implementacja:
Klasa testowa:
  1. public class StateTest {
  2. public static void main(String[] args) {
  3. Fan fan = new Fan();
  4. System.out.println(fan);
  5. fan.request();
  6. System.out.println(fan);
  7. fan.request();
  8. System.out.println(fan);
  9. fan.request();
  10. System.out.println(fan);
  11. }
  12. }
Klasa Context, obsługująca wzorzec stan:
  1. public class Fan {
  2. private State fanOffState;
  3. private State fanLowState;
  4.  
  5. private State state;
  6.  
  7. public Fan() {
  8. fanOffState = new FanOffState(this);
  9. fanLowState = new FanLowState(this);
  10.  
  11. state = fanOffState;
  12. }
  13.  
  14. public void request() {
  15. state.handle();
  16. }
  17.  
  18. public void setState(State state) {
  19. this.state = state;
  20. }
  21.  
  22. public State getFanOffState() {
  23. return fanOffState;
  24. }
  25.  
  26. public State getFanLowState() {
  27. return fanLowState;
  28. }
  29.  
  30.  
  31. @Override
  32. public String toString() {
  33. return state.toString();
  34. }
  35.  
  36. }
interface stanu i jego implementacja:
  1. public interface State {
  2. void handle();
  3. }
  4.  
  5. public class FanOffState implements State {
  6.  
  7. private final Fan fan;
  8.  
  9. public FanOffState(Fan fan) {
  10. this.fan = fan;
  11. }
  12.  
  13. @Override
  14. public void handle() {
  15. System.out.println("Zmiana prędkości na wolną.");
  16. fan.setState(fan.getFanLowState());
  17. }
  18.  
  19. @Override
  20. public String toString() {
  21. return "Wentylator wyłączony";
  22. }
  23. }
  24.  
  25. public class FanLowState implements State {
  26.  
  27. private final Fan fan;
  28.  
  29. public FanLowState(Fan fan) {
  30. this.fan = fan;
  31. }
  32.  
  33. @Override
  34. public void handle() {
  35. System.out.println("Wyłączenie wentylatora");
  36. fan.setState(fan.getFanOffState());
  37. }
  38.  
  39. @Override
  40. public String toString() {
  41. return "Niska prędkość wentylatora";
  42. }
  43. }
6. Zastosowanie w kodzie java:
- javax.faces.lifecycle.LifeCycle#execute()
created by cv.java.org.pl © 2023 All Rights Reserved.