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

dekorator (decorator) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec dekoratora to hierarchiczny wzorzec typu, który tworzy funkcjonalność na każdym poziomie,
używając kompozycji z podobnych typów danych. Opakowujem obiekty aby dodać im nową funkcjonalność.
Wzorzec projektowy dekoratora pozwala nam przypisać obowiązki do obiektu dynamicznie, bez wpływu na klasę
Dekorator przestrzega również zasady pojedynczej odpowiedzialności, która stanowi,
że każda klasa powinna odpowiadać za pojedynczą część funkcjonalności dostarczanej przez oprogramowanie,
a odpowiedzialność ta powinna być całkowicie ujęta w klasie.

2. Problem:
Chcemy opakować funkcjonalność klasy bez zmiany jej struktury.
Chcemy mieć możliwość opakowania jej na wiele sposóbów, zmienić jej zachowanie.
Oryginalny obiekt chcemy zostawić bez żadnych zmian.

3. Rozwiązanie:
Kontrolujesz, które elementy uzupełniają twój obiekt, niekoniecznie próbując go zastąpić,
tak jak w przypadku dziedziczenia.
Aby to osiągnąć, wykorzystuje kompozycję i dziedziczenie
Możesz komponować zachowanie dynamicznie, używając jednej z podklas, które zdobią twój obiekt.
Każde nowe opakowanie/udekorowanie to nowa klasa. Powoduje to tworzenie dużo małych klas

4. Diagram klas wzorca dekorator (decorator):


5. Implementacja:
  1. public interface Sandwich {
  2.     String make();
  3. }
  4.  
  5. public abstract class SandwichDecorator implements Sandwich {
  6.  
  7.     protected Sandwich customSandwich;
  8.  
  9.     public SandwichDecorator(Sandwich customSandwich) {
  10.         this.customSandwich = customSandwich;
  11.     }
  12.  
  13.     @Override
  14.     public String make() {
  15.         return customSandwich.make();
  16.     }
  17. }
  18.  
  19. public class SimpleSandwich implements Sandwich {
  20.     @Override
  21.     public String make() {
  22.         return "Bułka";
  23.     }
  24. }
  25.  
  26. public class MeatDecorator extends SandwichDecorator {
  27.  
  28.     public MeatDecorator(Sandwich customSandwich) {
  29.         super(customSandwich);
  30.     }
  31.  
  32.     @Override
  33.     public String make() {
  34.         return customSandwich.make() + addMeat();
  35.     }
  36.  
  37.     private String addMeat() {
  38.         return " + Szynka";
  39.     }
  40.  
  41. }
  42.  
  43. public class CheeseDecorator extends SandwichDecorator {
  44.  
  45.     public CheeseDecorator(Sandwich customSandwich) {
  46.         super(customSandwich);
  47.     }
  48.  
  49.     @Override
  50.     public String make() {
  51.         return customSandwich.make() + addCheese();
  52.     }
  53.  
  54.     private String addCheese() {
  55.         return " + Ser żółty";
  56.     }
  57.  
  58. }
  59.  
  60. public class DecoratorTest {
  61.         public static void main(String arg[]) {
  62.                 Sandwich sandwich = new CheeseDecorator(new MeatDecorator(new SimpleSandwich()));
  63.                 System.out.println(sandwich.make());
  64.                 // Bułka + Szynka + Ser żółty
  65.         }
  66.        
  67. }
  68.  
6. Zastosowanie w kodzie java:
- wszystkie podklasy: java.io.InputStream, OutputStream, Reader and Writer,
mają konstruktor który pozwala im akceptować ich własny typ.
- java.util.Collections, methods checkedXXX(), synchronizedXXX() i unmodifiableXXX().
- javax.servlet.http.HttpServletRequestWrapper i HttpServletResponseWrapper
created by cv.java.org.pl © 2023 All Rights Reserved.