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

Odwiedzający (visitor) - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec Odwiedzający (visitor) to świetny sposób na oddzielenie algorytmu od struktury obiektu.
Klasa Visitor zawiera zmiany i specjalizacje zamiast zmiany oryginalnego obiektu.
2. Problem:
Chcemy mieć klasę ale osługę nowych funkcji chcemy mieć w jednym miescu.
Mamy grupę obiektów i operację którą chcemy na nich wykonać.
Logikę obieków chcemy mieć w osobnej klasie.

3. Rozwiązanie:
Wzorzec Odwiedzający (visitor) implementuje interface który obsługuje każdy element i klasę wizytator dla niego.
Wizytator wie o każdym elemencie dla którego jest zaimplementowany.
Zamiast zmieniać każdy element mamy klasę wizytatora którą zmieniamy.

4. Diagram klas wzorca Odwiedzający (visitor):


5. Implementacja:
Klasa testująca:
  1. public class VisitorTest {
  2. public static void main(String[] args) {
  3. Element[] items = new Element[]{
  4. new Book(20, "Pan Tadeusz"),
  5. new Book(50, "Wzorce projektowe Java"),
  6. new Vegetable(3, 4, "Kapusta"),
  7. new Vegetable(5, 2, "Marchewka")};
  8.  
  9. int total = calculatePrice(items);
  10. System.out.println("Całkowita Cena = " + total);
  11. }
  12.  
  13. private static int calculatePrice(Element[] items) {
  14. ShoppingCartVisitor visitor = new ShoppingCartVisitorImpl();
  15. int sum = 0;
  16. for (Element item : items) {
  17. sum = sum + item.accept(visitor);
  18. }
  19. return sum;
  20. }
  21. }
implemetacja Klasy Element:
  1. public interface Element {
  2. int accept(ShoppingCartVisitor visitor);
  3. }
  4.  
  5. public class Book implements Element {
  6.  
  7. private int price;
  8. private String title;
  9.  
  10. public Book(int cost, String title) {
  11. this.price = cost;
  12. this.title = title;
  13. }
  14.  
  15. public int getPrice() {
  16. return price;
  17. }
  18.  
  19. public String getTitle() {
  20. return title;
  21. }
  22.  
  23. @Override
  24. public int accept(ShoppingCartVisitor visitor) {
  25. return visitor.visit(this);
  26. }
  27.  
  28. }
  29.  
  30. public class Vegetable implements Element {
  31.  
  32. private int pricePerKg;
  33. private int weight;
  34. private String name;
  35.  
  36. public Vegetable(int pricePerKg, int weight, String name) {
  37. this.pricePerKg = pricePerKg;
  38. this.weight = weight;
  39. this.name = name;
  40. }
  41.  
  42. public int getPricePerKg() {
  43. return pricePerKg;
  44. }
  45.  
  46. public int getWeight() {
  47. return weight;
  48. }
  49.  
  50. public String getName() {
  51. return this.name;
  52. }
  53.  
  54. @Override
  55. public int accept(ShoppingCartVisitor visitor) {
  56. return visitor.visit(this);
  57. }
  58.  
  59. }
implementacja wizytatora:
  1. public interface ShoppingCartVisitor {
  2. int visit(Book book);
  3. int visit(Vegetable vegetable);
  4. }
  5.  
  6. public class ShoppingCartVisitorImpl implements ShoppingCartVisitor {
  7.  
  8. @Override
  9. public int visit(Book book) {
  10. int cost;
  11. // powyżej 50 zł 5 zł rabatu
  12. if (book.getPrice() > 30) {
  13. cost = book.getPrice() - 3;
  14. } else {
  15. cost = book.getPrice();
  16. }
  17. System.out.println("Tytuł::" + book.getTitle() + " cena =" + cost);
  18. return cost;
  19. }
  20.  
  21. @Override
  22. public int visit(Vegetable vegetable) {
  23. int cost = vegetable.getPricePerKg() * vegetable.getWeight();
  24. System.out.println(vegetable.getName() + " cena = " + cost);
  25. return cost;
  26. }
  27. }
Wynik programu:
Tytuł::Pan Tadeusz cena =20
Tytuł::Wzorce projektowe Java cena =47
Kapusta cena = 12
Marchewka cena = 10
Całkowita Cena = 89
6. Zastosowanie w kodzie java:
- javax.lang.model.element.Element i javax.lang.model.element.ElementVisitor
- javax.lang.model.type.TypeMirror i javax.lang.model.type.TypeVisitor
created by cv.java.org.pl © 2023 All Rights Reserved.