1 / 36

Wzorce projektowe

Wzorce projektowe. Paweł Ciach. Plan prezentacji:. 1. Czym są wzorce projektowe 2. Historia wzorców projektowych 3. Simple Factory i Decorator - przykłady wzorców 4. Przegląd podstawowych wzorców projektowych 5. MVC, MVP, HMVC. Czym są wzorce projektowe.

penney
Télécharger la présentation

Wzorce projektowe

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Wzorce projektowe Paweł Ciach

  2. Plan prezentacji: 1. Czym są wzorce projektowe 2. Historia wzorców projektowych 3. Simple Factory i Decorator - przykłady wzorców 4. Przegląd podstawowych wzorców projektowych 5. MVC, MVP, HMVC

  3. Czym są wzorce projektowe W literaturze można spotkać się z różnymi definicjami: • Wzorce projektowe stanowią powtarzalne rozwiązanie zagadnień projektowych, z którymi się wciąż spotykamy • Wzorce projektowe stanowią zbiór reguł określających jak osiągnąć pewne cele w dziedzinie programowania • Wzorzec adresowany jest do powtarzających się problemów, które pojawiają się w specyficznych momentach projektowania i stanowi dla nich rozwiązanie • Wzorzec identyfikuje i specyfikuje pewna abstrakcję, której poziom znajduje się powyżej poziomu abstrakcji pojedynczej klasy, instancji lub komponentu • Wzorce projektowe w największym stopniu dotyczą problematyki proponowanego użycia powtarzających się motywów architektury programów, zaś szkielety aplikacji dotyczą szczegółów projektowych i implementacyjnych • Każdy wzorzec jest złożoną z trzech elementów zasadą, wyrażającą relacje pomiędzy pewnym kontekstem, problemem i rozwiązaniem

  4. Czym są wzorce projektowe Cechy wzorców: • Są abstrakcyjne - dostarczają rozwiązania problemów w sposób pozwalający na zastosowanie w wielu okolicznościach. • Ale są też konkretne - wiadomo co trzeba zrobić aby stworzyć rozwiązanie zgodne z danym wzorcem. • Dotyczą architektury programów - opisują zależności pomiędzy częściami składowymi programu. • Są związane z programowaniem obiektowym. • Zazwyczaj powstają w wyniku iteracyjnego dochodzenia do najlepszego rozwiązania jakiejś klasy problemów. Zazwyczaj w wyniku pracy wielu osób. • Każdy wzorzec stanowi pojęcie zamykające w sobie jakąś złożoność. Przy jego powszechnej akceptacji, ułatwia komunikację pomiędzy twórcami oprogramowania. • Trudno tutaj o formalizację.

  5. Historia wzorców projektowych • Architektura, koniec lat 70 - Christopher Alexander. • Próbował znaleźć alternatywę dla metod stosowanych w architekturze, bo chciał uniknąć wad tych metod: nadmiernego oderwania abstrakcyjnych modeli, które wielokrotnie sprawiały problemy kiedy dochodziło do konkretnej realizacji. • Zwracał uwagę na zaskakującą skuteczność niektórych spośród metod tradycyjnych. Wypracowane ewolucyjnie, na przestrzeni wielu lat praktyki, często dawały dobre efekty. • W jednej ze swoich prac dostarczył 253 wzorców - każdy wzorzec był małym podręcznikiem dotyczącym jakiegoś zagadnienia architektury. Przykładowy wzorzec: „Główne wejście”. • Każdy ze wzorców składał się z nazwy, przykładu, kontekstu, problemu, rozwiązania.

  6. Historia wzorców projektowych • Pomysły Alexandra nie spodobały się architektom, ale okazało się, że dobrze się sprawdzają w OOD/OOP. • Ward Cunningham i Kent Beck użyli koncepcji wzorców projektowych do tworzenia pomocy naukowych dla początkujących programistów smalltalka. • Pierwszy wzorzec projektowy - MVC. • “Design Patterns: Abstraction and Reuse of Object Oriented-Design” - Gang Of Four: E. Gamma, R. Helm, R. Johnson, J. Vlissides (1995). • Książka GoF opisuje 24 wzorce projektowe. Te wzorce są aktualnie powszechnie znane i stosowane.

  7. Przykład wzorca: Simple Factory • Wzorzec konstrukcyjny - czyli taki który służy do pozyskiwania obiektów. • Stanowi wersję wzorca Factory Method. • Idea - scentralizowany punkt z którego pobieramy nowe obiekty. Tym punktem jest obiekt fabryki. Metoda tego obiektu dostarcza obiekty o danym interfejsie - decydując o tym który obiekt dostarczyć w zależności od dostarczonych argumentów. • Oczywista zaleta stosowania tego wzorca - mamy centralny punkt który zwraca obiekty o danym interfejsie - możemy łatwo dokonać późniejszych modyfikacji w jednym punkcie. Kod korzystający z metody zwracającej obiekty ma informację jedynie o interfejsie.

  8. Przykład zastosowania Simple Factory Ktoś wpisuje w pole tekstowe imię i nazwisko w postaci „imię nazwisko”, lub „nazwisko, imię”. Fabryka (FabrykaNazywaczy) ma metodę dajNazywacza. Metoda ta dostaje wprowadzony String i decyduje o tym jakiej klasy obiekt zwrócić. Zwracane obiekty mają klasy będącymi klasami pochodnymi klasy Nazywacz. W zależności od tego z jakim przypadkiem mamy do czynienia, zwracany obiekt może być klasy ImiePierwsze, albo NazwiskoPierwsze.

  9. Przykład zastosowania Simple Factory

  10. Przykład wzorca: Decorator Wzorzec strukturalny - taki który opisuje sposób łączenia klas i obiektów w większe struktury. Kontekst: Załóżmy, że mamy grupę klas pochodzących od jakiejś klasy nadrzędnej. Chcemy do części z tych klas dodać jakieś specjalne zachowanie. Problem: Podchodząc do problemu standardowo, czyli dziedzicząc z każdej z klas której zachowanie wzbogacamy, możemy nadmiernie rozbudowywać hierarchię dziedziczenia. Możemy też kilkukrotnie wykonywać tą samą pracę. Poza tym nie można dynamicznie dodawać wspomnianego zachowania. Rozwiązanie: Tworzyć klasy dodające specjalne zachowania. Następnie przekazywać klasy których zachowanie rozszerzamy do konstruktora klasy typu dekorator. Klasy tworzące zachowanie powinny mieć ten sam interfejs co klasy rozszerzane (tzn. gdzieś w hierarchii dziedziczenia powinny mieć wspólnego przodka)

  11. Przykład wzorca: Decorator

  12. Przykład zastosowania wzorca Decorator • Program do obsługi kawiarni. • Powinny występować różne rodzaje kawy – przykładowo Espresso i Podwójne Espresso. • Dodatkowo różne rodzaje kawy mogą występować w różnych wersjach – może być to kawa z mlekiem, może być z dodatkiem czekolady. • W zależności od wersji, cena kawy odpowiednio się modyfikuje. Dodatkowo, opis kawy powinien wyświetlać się w inny sposób w zależności od wersji. • Interfejs Kawa ma metody: • podajCenę() • podajOpis() • Zadaniem klas dziedziczących jest dostarczenie odpowiednich opisów oraz cen dla różnych kombinacji kaw i dodatków

  13. Przykład zastosowania wzorca Decorator Rozwiązanie bez wzorca Decorator - rozbudowana hierarchia dziedziczenia.

  14. Przykład zastosowania wzorca Decorator Użycie wzorca Decorator - uproszczenie i ‘dynamizacja’.

  15. Przykład zastosowania wzorca Decorator Zastosowanie wzorca Decorator bardziej „z życia wzięte”: dekorowanie przycisków. public class Decorator extends JComponent { public Decorator(JComponent c) { setLayout(new BorderLayout()); add("Center", c); }} public class CoolDecorator extends Decorator { boolean mouse_over; JComponent thisComp; public CoolDecorator(JComponent c) { super(c); mouse_over = false; thisComp = this; c.addMouseListener(new MouseAdapter() public void mouseEntered(MouseEvent e) { mouse_over = true; thisComp.repaint(); } public void mouseExited(MouseEvent e) { mouse_over = false; thisComp.repaint(); } }); } public void paint(Graphics g) { super.paint(g); if (! mouse_over) { Dimension size = super.getSize(); g.setColor(Color.lightGray); g.drawRect(0, 0, size.width-1, size.height-1); g.drawLine(size.width-2, 0, size.width-2, size.height-1); g.drawLine(0, size.height-2, size.width-2, size.height-2); } } }

  16. Przykład zastosowania wzorca Decorator public class slashWindow extends JxFrame implements ActionListener { JButton CButton, DButton, Quit; public slashWindow() { super ("Deco Button"); //Klasa JxFrame zajmuje się ustawieniem tytułu okna i innymi sprawami JPanel jp = new JPanel(); getContentPane().add(jp); jp.add( new CoolDecorator(CButton = new JButton("Cbutton"))); jp.add( new CoolDecorator(DButton = new JButton("Dbutton"))); jp.add(Quit = new JButton("Quit")); Quit.addActionListener(this); setSize(new Dimension(200,100)); setVisible(true); Quit.requestFocus(); } public void actionPerformed(ActionEvent e) { System.exit(0); } static public void main(String argv[]) { new slashWindow(); } }

  17. Przykład zastosowania wzorca Decorator Kolejny dekorator - teraz możemy mieszać różne ‘dodatki’. public class SlashDecorator extends Decorator { int x1, y1, w1, h1; public SlashDecorator(JComponent c) { super(c); } public void setBounds(int x, int y, int w, int h) { x1 = x; y1= y; w1 = w; h1 = h; super.setBounds(x, y, w, h); } public void paint(Graphics g) { super.paint(g); g.setColor(Color.red); g.drawLine(0, 0, w1, h1); } } jp.add( new CoolDecorator(CButton = new JButton("Cbutton"))); jp.add( new SlashDecorator(new CoolDecorator(new JButton("Dbutton")))); // jp.add( new CoolDecorator(DButton = new JButton("Dbutton")));

  18. Przegląd podstawowych wzorców 1. Wzorce konstrukcyjne 2. Wzorce strukturalne 3. Wzorce czynnościowe

  19. Przegląd podstawowych wzorców Wzorce konstrukcyjne: • Simple Factory / Factory Method • Abstract Factory • Singleton • Builder • Prototype

  20. Przegląd podstawowych wzorców Simple Factory / Factory Method • Factory method rozwija Simple Factory w tym sensie, że następuje delegacja odpowiedzialności za tworzenie klasy do podklas fabryki. • Do zastosowania gdy: • Klasa nie może przewidzieć jakie obiekty tworzyć, • Klasa używa klas pochodnych w celu określenia który obiekt utworzyć, lub gdy chcemy informację o tym które klasy utworzyć umieścić w klasach pochodnych.

  21. Przegląd podstawowych wzorców Abstract Factory Dodaje jeszcze trochę złożoności do Factory Method. Jest wiele metod zwracających tworzone obiekty. Obiekty muszą spełniać interfejsy. Do zastosowania gdy chcemy mieć abstrakcję produkowanych obiektów i dostarczać w sposób spójny całe rodziny produktów. Przykład: Look&Feel

  22. Przegląd podstawowych wzorców Pozostałe: • Singleton- gdy chcemy tylko jeden egzemplarz obiektu danej klasy (uniemożliwienie stworzenia więcej niż jednego) • Builder - gdy obiekt tworzony jest w wielu krokach. Te kroki wykonywane są „na zewnątrz” obiektu klasy Builder, który dostarcza interfejsu z którego korzysta klasa faktycznie dokonująca konstrukcji obiektu (Zwana Director lub Context). • Prototype - obiekty nie są tworzone od podstaw lecz klonowane. Np. jest kolekcja obiektów i wybiera się jeden spośród nich, zwracając klientowi.

  23. Przegląd podstawowych wzorców Wzorce strukturalne: • Adapter • Bridge • Composite • Decorator • Facade • Flyweight • Proxy

  24. Przegląd podstawowych wzorców Adapter Dopasowanie (adaptowanie) interfejsu klasy. Do użycia, gdy mamy istniejącą klasę której chcemy użyć, ale nie zgadza się interfejs. Wersja z wielo-dziedziczeniem Wersja z delegacją

  25. Przegląd podstawowych wzorców Pozostałe: • Bridge - podobny do wzorca Adapter. Osobna klasa dla abstrakcji i osobna dla implementacji. Dwie hierarchie dziedziczenia. Implementacja jest ukrywana. • Composite - sugeruje aby tworzyć drzewiaste struktury w taki sposób, że węzły i liście mają ten sam interfejs. • Decorator - omawiany wcześniej • Facade - stosowany gdy mamy złożony zestaw obiektów ze skomplikowanymi zależnościami. Dodajemy nowy obiekt który dostarcza prostego interfejsu. Ogranicza to możliwości, ale zawsze można skorzystać z pełnego zestawu obiektów. • Flyweight - gdy występuje potrzeba użycia bardzo wielu instancji danej klasy. Wzorzec ten pokazuje jak tworzyć jedną instancję zastępującą wiele. • Proxy - pośrednik. Działania wykonywane są na nim, a on działa na właściwej klasie (o tym samym interfejsie). Szczególnie użyteczny w środowisku sieciowym.

  26. Przegląd podstawowych wzorców Wzorce czynnościowe: • State • Observer • Chain of Responsibility • Command • Iterator • Mediator • Strategy • Visitor

  27. Przegląd podstawowych wzorców State Możliwość przełączania obiektu ukrytego pod interfejsem klasy State. Context może przykładowo trzymać klasy dziedziczące ze State jako inner classes. Do zastosowania, gdy występuje dużo instrukcji sterujących typu if/switch - z użyciem stanu można to ograniczyć.

  28. Przegląd podstawowych wzorców Observer Gdy jeden z obiektów (Observer) chce być informowany o zmianach zachodzących w innym obiekcie (Subject). Może być kilka obserwatorów jednego obiektu klasy Subject. Obiekty w tej relacji mogą być luźno powiązane. Różne sposoby realizacji.

  29. Przegląd podstawowych wzorców Pozostałe: • Chain of Responsibility - nadawca wysyła żądanie do jednego z obiektów, a obiekty z łańcuch przekazują sobie żądanie. • Command - żądanie ma formę obiektu • Iterator - poruszanie się po dowolnej kolekcji danych • Mediator - pośrednik między obiektami - brak jawnych odwołań • Strategy - podobnie do State. Różnica jest taka, że w State zmiany zależały od zmian w wewnętrznym stanie obiektu - tutaj zmiana jest wykonywana z zewnątrz. Dodatkowo w State każda z klas mogła robić zupełnie co innego, a tutaj ma robić dokładnie to samo (ale być może w inny sposób). • Visitor - klasa Visitor odwiedza każdy z obiektów.

  30. MVC

  31. MVC

  32. MVC

  33. MVP

  34. M V M V V M V M C C C Composite MVP Component

  35. Controller Controller Controller Controller Controller HMVC

  36. Literatura i zasoby: 1. Cooper J. W. (2000) , Java. Wzorce Projektowe, Gliwice 2."Thinking in patterns" Bruce Eckel'a (www.mindview.net) 3. Opis prac Christophera Alexandra - http://g.oswego.edu/dl/ca/ca/ca.html 4. Zwięzły ekstrakt mówiący o wzorcach na podstawie klasycznych książek z dziedziny: http://pages.cpsc.ucalgary.ca/~kremer/patterns/ 5. www.object-arts.com - ciekawe informacje o MVC/MVP. O innych wzorcach też. 6. Artykuły o HMVC

More Related