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

Łańcuch zobowiązań (Chain of Responsibility) - wzorzec projektowy (design pattern) - java

1. Cel:
Łańcuch zobowiązań (Chain of Responsibility) oddziela żądanie od obiektu obsługi
w łańcuchu procedur obsługi, aż do ostatecznego rozpoznania.
Chcemy przekazać zapytanie do obiektu odbierającego,
nie wiedząc, kto był nadawcą.
Jak również, nadawca nie powinien wiedzieć, kto był odbiorcą,
aby przetworzyć to żądanie.
2. Problem:
Chcemy oddzielić obiekty nadawcy (sender) i odborcy (receiver).
Bez informacji kto jest nadawcą a kto odbiorcą.

3. Rozwiązanie:
Podczas używania wzorca odbiorca (receiver) powinien zawierać
odniesienie (referencje) do następnego odbiorcy. tzw. następcy (successor).
Nie znamy całej hierarchii ale wiemy kto jest następny.
Wybieramy ten wzorzec aby wybrać luźne połączenie.
Tworzymy łańcuch w którym odbiorcy przetwarzają żądanie.
Jeśli jeden objekt nie przetworzył żadania, zostaje przekazany następnemu.

4. Diagram klas wzorca Łańcuch zobowiązań (Chain of Responsibility):


5. Implementacja:
Klasa testująca łańcuch zobowiązań:

  1. class ChainOfResponsibilityTest {
  2. public static void main(String[] args) {
  3. NominalChainHandler nominalHandler_100 = new NominalHandler_100(100);
  4. NominalChainHandler nominalHandler_50 = new NominalHandler_50(50);
  5. NominalChainHandler nominalHandler_10 = new NominalHandler_10(10);
  6. NominalChainHandler nominalHandler_5 = new NominalHandler_5(5);
  7. NominalChainHandler nominalHandler_2 = new NominalHandler_2(2);
  8. NominalChainHandler nominalHandler_1 = new NominalHandler_1(1);
  9.  
  10. // ustawienie łańcuchów
  11. nominalHandler_100.setNextHandler(nominalHandler_50);
  12. nominalHandler_50.setNextHandler(nominalHandler_10);
  13. nominalHandler_10.setNextHandler(nominalHandler_5);
  14. nominalHandler_5.setNextHandler(nominalHandler_2);
  15. nominalHandler_2.setNextHandler(nominalHandler_1);
  16.  
  17. // użycie (TEST)
  18. System.out.println("Rozłóż na drobne 5310 $");
  19. nominalHandler_100.handler(5310);
  20. System.out.println("Rozłóż na drobne 250 $");
  21. nominalHandler_100.handler(250);
  22. System.out.println("Rozłóż na drobne 430 $");
  23. nominalHandler_100.handler(430);
  24. }
  25. }
Klasa abstrakcyjna która jest handlerem dla konkretnych nominałów:

  1. public abstract class NominalChainHandler {
  2. NominalChainHandler nextHandler = null;
  3. Integer wielkoscJednostki = 0;
  4.  
  5. public MoneyChainHandler setNextHandler (MoneyChainHandler nextHandler) {
  6. this.nextHandler = nextHandler;
  7. return this.nextHandler;
  8. }
  9.  
  10. public void handler (int wielkoscCalosc) {
  11. int ilosc = wielkoscCalosc / wielkoscJednostki;
  12. int reszta = wielkoscCalosc % wielkoscJednostki;
  13.  
  14. if (ilosc > 0) {
  15. System.out.printf("podzielone na: %d X %d = %d rodzaj: %s \n", wielkoscJednostki, ilosc, (wielkoscJednostki * ilosc), this.getClass().getSimpleName());
  16. }
  17. if (nextHandler != null && reszta > 0) {
  18. nextHandler.handler(reszta);
  19. }
  20. }
  21. }
Implementacja konkretnych nominałów:

  1. public class NominalHandler_100 extends NominalChainHandler {
  2. public HundrenDollarHandler_100 (Integer wielkoscJednostki) {
  3. this.wielkoscJednostki = wielkoscJednostki;
  4. }
  5. }
  6.  
  7. public class NominalHandler_50 extends NominalChainHandler {
  8. public NominalHandler_50 (Integer wielkoscJednostki) {
  9. this.wielkoscJednostki = wielkoscJednostki;
  10. }
  11. }
  12.  
  13. public class NominalHandler_10 extends NominalChainHandler {
  14. public NominalHandler_10 (Integer wielkoscJednostki) {
  15. this.wielkoscJednostki = wielkoscJednostki;
  16. }
  17. }
  18.  
  19. public class NominalHandler_5 extends NominalChainHandler {
  20. public NominalHandler_5 (Integer wielkoscJednostki) {
  21. this.wielkoscJednostki = wielkoscJednostki;
  22. }
  23. }
  24.  
  25. public class NominalHandler_2 extends NominalChainHandler {
  26. public NominalHandler_2 (Integer wielkoscJednostki) {
  27. this.wielkoscJednostki = wielkoscJednostki;
  28. }
  29. }
  30.  
  31. public class NominalHandler_1 extends NominalChainHandler {
  32. public NominalHandler_1 (Integer wielkoscJednostki) {
  33. this.wielkoscJednostki = wielkoscJednostki;
  34. }
  35. }
Wynikiem wywołanej klasy testowej jest:

Rozłóż na drobne 5310 $
podzielone na: 100 X 53 = 5300 rodzaj: NominalHandler_100
podzielone na: 10 X 1 = 10 rodzaj: NominalHandler_10
Rozłóż na drobne 250 $
podzielone na: 100 X 2 = 200 rodzaj: NominalHandler_100
podzielone na: 50 X 1 = 50 rodzaj: NominalHandler_50
Rozłóż na drobne 430 $
podzielone na: 100 X 4 = 400 rodzaj: NominalHandler_100
podzielone na: 10 X 3 = 30 rodzaj: NominalHandler_10

6. Zastosowanie w kodzie java:
- java.util.logging.Logger#log ()
- javax.servlet.Filter#doFilter ()
- Spring security filter chain
created by cv.java.org.pl © 2023 All Rights Reserved.