36
Wzorce projektowe Wzorce projektowe Paweł Ciach Paweł Ciach

Wzorce projektowe

  • Upload
    penney

  • View
    48

  • Download
    2

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Wzorce projektowe

Wzorce projektoweWzorce projektowe

Paweł CiachPaweł Ciach

Page 2: Wzorce projektowe

Plan prezentacji:Plan prezentacji:

1. Czym są wzorce projektowe2. Historia wzorców projektowych3. Simple Factory i i Decorator - przykłady wzorców- przykłady wzorców4. Przegląd podstawowych wzorców projektowych4. Przegląd podstawowych wzorców projektowych5. MVC, MVP, HMVC5. MVC, MVP, HMVC

Page 3: Wzorce projektowe

Czym są wzorce projektoweCzym 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:W literaturze można spotkać się z różnymi definicjami:

Page 4: Wzorce projektowe

Czym są wzorce projektoweCzym są wzorce projektoweCechy wzorców: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ę.

Page 5: Wzorce projektowe

Historia wzorców projektowychHistoria 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.

Page 6: Wzorce projektowe

Historia wzorców projektowychHistoria 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.

Page 7: Wzorce projektowe

Przykład wzorca: Simple FactoryPrzykł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.

Page 8: Wzorce projektowe

Przykład zastosowania Simple FactoryPrzykł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.

Page 9: Wzorce projektowe

Przykład zastosowania Simple FactoryPrzykład zastosowania Simple Factory

Page 10: Wzorce projektowe

Przykład wzorca: DecoratorPrzykł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.

Page 11: Wzorce projektowe

Przykład wzorca: DecoratorPrzykład wzorca: Decorator

Page 12: Wzorce projektowe

Przykład zastosowania wzorca DecoratorPrzykł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

Page 13: Wzorce projektowe

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

Page 14: Wzorce projektowe

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

Page 15: Wzorce projektowe

Przykład zastosowania wzorca DecoratorPrzykład zastosowania wzorca DecoratorZastosowanie 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); } }}

Page 16: Wzorce projektowe

Przykład zastosowania wzorca DecoratorPrzykład zastosowania wzorca Decoratorpublic 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(); }}

Page 17: Wzorce projektowe

Przykład zastosowania wzorca DecoratorPrzykł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")));

Page 18: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorców

1. Wzorce konstrukcyjne

2. Wzorce strukturalne

3. Wzorce czynnościowe

Page 19: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorców

Wzorce konstrukcyjne:

• Simple Factory / Factory Method

• Abstract Factory

• Singleton

• Builder

• Prototype

Page 20: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówSimple 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.

Page 21: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówAbstract 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

Page 22: Wzorce projektowe

Przegląd podstawowych wzorcówPrzeglą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:

Page 23: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorców

Wzorce strukturalne:

• Adapter

• Bridge

• Composite

• Decorator

• Facade

• Flyweight

• Proxy

Page 24: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówAdapter

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ą

Page 25: Wzorce projektowe

Przegląd podstawowych wzorcówPrzeglą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:

Page 26: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówWzorce czynnościowe:

• State

• Observer

• Chain of Responsibility

• Command

• Iterator

• Mediator

• Strategy

• Visitor

Page 27: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówState

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ć.

Page 28: Wzorce projektowe

Przegląd podstawowych wzorcówPrzegląd podstawowych wzorcówObserver

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.

Page 29: Wzorce projektowe

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ówPrzegląd podstawowych wzorców

Page 30: Wzorce projektowe

MVCMVC

Page 31: Wzorce projektowe

MVCMVC

Page 32: Wzorce projektowe

MVCMVC

Page 33: Wzorce projektowe

MVPMVP

Page 34: Wzorce projektowe

Composite MVP ComponentComposite MVP Component

M VM

V

C

M

V

C

M

V

C

Page 35: Wzorce projektowe

HMVCHMVC

Controller

Controller

Controller

Controller

Controller

Page 36: Wzorce projektowe

Literatura i zasoby:Literatura i zasoby:

1. Cooper J. W. (2000) , Java. Wzorce Projektowe, Gliwice2."Thinking in patterns" Bruce Eckel'a (www.mindview.net)3. Opis prac Christophera Alexandra - http://g.oswego.edu/dl/ca/ca/ca.html4. 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