Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wzorce projektowe Paweł Ciach. Plan prezentacji: 1. Czym są wzorce projektowe 2. Historia wzorców projektowych i - przykłady wzorców 3. Simple Factory.

Podobne prezentacje


Prezentacja na temat: "Wzorce projektowe Paweł Ciach. Plan prezentacji: 1. Czym są wzorce projektowe 2. Historia wzorców projektowych i - przykłady wzorców 3. Simple Factory."— Zapis prezentacji:

1 Wzorce projektowe Paweł Ciach

2 Plan prezentacji: 1. Czym są wzorce projektowe 2. Historia wzorców projektowych i - przykłady wzorców 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 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 W literaturze można spotkać się z różnymi definicjami:

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 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) Wzorzec strukturalny - taki który opisuje sposób łączenia klas i obiektów w większe struktury.

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 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); } Kolejny dekorator - teraz możemy mieszać różne dodatki. 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 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. Pozostałe:

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 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. Pozostałe:

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 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. Pozostałe: Przegląd podstawowych wzorców

30 MVC

31 MVC

32 MVC

33 MVP

34 Composite MVP Component MV M V C M V C M V C

35 HMVC Controller

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 Zwięzły ekstrakt mówiący o wzorcach na podstawie klasycznych książek z dziedziny: ciekawe informacje o MVC/MVP. O innych wzorcach też. 6. Artykuły o HMVC


Pobierz ppt "Wzorce projektowe Paweł Ciach. Plan prezentacji: 1. Czym są wzorce projektowe 2. Historia wzorców projektowych i - przykłady wzorców 3. Simple Factory."

Podobne prezentacje


Reklamy Google