Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
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) { }); 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
Composite MVP Component
35
HMVC Controller
36
Literatura i zasoby: 1. Cooper J. W. (2000) , Java. Wzorce Projektowe, Gliwice 2."Thinking in patterns" Bruce Eckel'a ( 3. Opis prac Christophera Alexandra - 4. 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
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.