Wzorce projektowe Paweł Ciach.

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Wzorce Projektowe Bartosz Baliś, Na podstawie
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
Zaawansowane metody programowania – Wykład V
Generics w .NET 2.0 Łukasz Rzeszot.
Obiektowe metody projektowania systemów Design Patterns STRATEGY.
Implementacja ekstensji klasy
Programowanie obiektowe w Javie
W ZORCE P ROJEKTOWE … czyli ktoś już rozwiązał Twoje problemy!
Szkolenie dla NaviExpert,
Obiektowe metody projektowania systemów
Obiektowe metody projektowania systemów
Zasady zaliczenia Warunki uzyskania zaliczenia:
Plan Prezentacji Wczytywanie grafiki Wyświetlanie obrazów
Wzorce projektowe w J2EE
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład IV
Projektowanie i programowanie obiektowe II - Wykład II
Projektowanie - wprowadzenie
Wzorce projektowe (Design Patterns)
Projektowanie obiektowe
Źródła: podręcznikopracował: A. Jędryczkowski.
Projektowanie obiektowe
Jakub Wołczko W obiektowym świecie… Jakub Wołczko
Programowanie obiektowe III rok EiT
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
WPROWADZENIE W ŚWIAT OBIEKTÓW
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Maciek Mięczakowski
Inicjalizacja i sprzątanie
JAVA.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Projektowanie obiektowe
Projektowanie obiektowe
Projektowanie obiektowe
Projektowanie obiektowe
Farseer Physics Engine. Farseer Physics Engine jest silnikiem fizycznym napisanym dla platformy.NET. Został on zainspirowany przez silnik Box2D znany.
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Programowanie w języku C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
Wzorce projektowe Jacek Matulewski
Kurs języka C++ – wykład 4 ( )
OOP, Desing Patterns … and more Michał Dubel
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Zakres Wzorce projektowe ( -Adapter (str , wykład wzorce projektowe.
Obiektowe metody projektowania systemów Abstract Factory design pattern (aka. Kit)
Zakres Wzorce projektowe - kreacyjne -Factory Method -Abstract Factory.
Paweł Starzyk Obiektowe metody projektowania systemów
Wzorce Projektowe w JAVA
Programowanie Zaawansowane
Partnerstwo dla Przyszłości 1 Lekcja 27 Klasy i obiekty.
Inżynieria oprogramowania Wzorce konstrukcyjne WWW: Jacek Matulewski Instytut Fizyki, UMK.
Programowanie Obiektowe – Wykład 6
Wzorzec MVC na przykładzie CakePHP
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
PGO Interfejsy Michail Mokkas.
JavaBeans by Paweł Wąsala
PGO - Projektowanie i implementacja pierwszych klas
PGO Dziedziczenie Michail Mokkas.
Zapis prezentacji:

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

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

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.

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.

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.

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.

Przykład zastosowania Simple Factory

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)

Przykład wzorca: Decorator

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

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

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

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); }

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();

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")));

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

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

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.

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

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.

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

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ą

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.

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

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

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.

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.

MVC

MVC

MVC

MVP

Composite MVP Component

HMVC Controller

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