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

Obserwator (observer) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec Obserwator (observer) to wzorzec w którym mamy przedmiot (subject),
który jest obserwowany przez jednego lub więcej obserwatorów.
Często używany w MVC gdzie widok (View) jest sterowane zdarzeniami.
2. Problem:
Chcemy mieć temat (subject) który jest oddzielony od objektu.
Jest to relacja jeden do wielu. Zaimplementowany jako obsługa zdarzeń.
Można to nazwać obsługą wydawcy (Publisher) i abonentów (Subscriber),
choć ten wzorzec jest typowo synchroniczny.

3. Rozwiązanie:
Wzorzec składa się z następujących elementów:
Temat (Subject): Zwykle jest to interfejs, który musi zostać zaimplementowany przez
klasy i powinien być obserwowany. Zarejestrowani obserwatorzy powinni być powiadomieni.
Mogą być od rejestrowani i wtedy przestają być powiadamiani.
KonkretnyTemat (ConcreteSubject): jest to klasa, która implementuje interfejs tematu (subject).
Obsługuje listę obserwatorów i informuje ich o zmianach.
Obserwator (Observer): jest to interfejs, który jest implementowany przez obiekty,
które powinny być informowane o zmianach Tematu (subject).
Każdy obserwator powinien zaimplementować metodę update, która informuje go o nowych zmianach stanu.

4. Diagram klas wzorca Obserwator (observer):


5. Implementacja:
Klasa testująca:
  1. public class ObserverTest {
  2. public static void main(String[] args)
  3. {
  4. Observer sub1 = new ConcrateObserver("Sub1");
  5. Observer sub2 = new ConcrateObserver("Sub2");
  6. Observer sub3 = new ConcrateObserver("Sub3");
  7.  
  8. Subject p = new ConcrateSubject();
  9.  
  10. p.attach(sub1);
  11. p.attach(sub2);
  12. // Sub1 i Sub2
  13. p.notifyUpdate(new Message("Pierwsza wiadomość"));
  14.  
  15. p.detach(sub1);
  16. p.attach(sub3);
  17. // Sub2 i Sub3 (Sub1 został usunięty)
  18. p.notifyUpdate(new Message("Druga wiadomość"));
  19. }
  20. }
Klasa pomocnicza:
  1. public class Message
  2. {
  3. final String messageContent;
  4.  
  5. public Message (String m) {
  6. this.messageContent = m;
  7. }
  8.  
  9. public String getMessageContent() {
  10. return messageContent;
  11. }
  12. }
Implementacja tematu (Subject):
  1. public interface Subject {
  2. void attach(Observer o);
  3. void detach(Observer o);
  4. void notifyUpdate(Message m);
  5. }
  6.  
  7. public class ConcrateSubject implements Subject {
  8.  
  9. private List<Observer> observers = new ArrayList<>();
  10.  
  11. @Override
  12. public void attach(Observer o) {
  13. observers.add(o);
  14. }
  15.  
  16. @Override
  17. public void detach(Observer o) {
  18. observers.remove(o);
  19. }
  20.  
  21. @Override
  22. public void notifyUpdate(Message m) {
  23. for(Observer o: observers) {
  24. o.update(m);
  25. }
  26. }
  27. }
Implementacja obserwatora (Observer):
  1. public interface Observer {
  2. void update(Message m);
  3. }
  4.  
  5. public class ConcrateObserver implements Observer {
  6. private String name;
  7. public ConcrateObserver(String name) {
  8. this.name = name;
  9. }
  10.  
  11. @Override
  12. public void update(Message m) {
  13. System.out.println(name + ": " + m.getMessageContent());
  14. }
  15. }

Wyniki działania programu:
Sub1: Pierwsza wiadomość
Sub2: Pierwsza wiadomość
Sub2: Druga wiadomość
Sub3: Druga wiadomość

6. Zastosowanie w kodzie java:
- java.util.Observer/java.util.Observable
- java.util.EventListener - wszystkie implementacje Swing
- javax.servlet.http.HttpSessionBindingListener
- javax.servlet.http.HttpSessionAttributeListener
- javax.faces.event.PhaseListener
created by cv.java.org.pl © 2023 All Rights Reserved.