Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wzorce projektowe (Design Patterns)

Podobne prezentacje


Prezentacja na temat: "Wzorce projektowe (Design Patterns)"— Zapis prezentacji:

1 Wzorce projektowe (Design Patterns)
Barbara Palacz Kraków, 25/10/2004 AGH, Informatyka II rok

2 Wstęp „Każdy wzorzec opisuje problem, który ciągle na nowo pojawia się w naszym otoczeniu i opisuje rdzeń jego rozwiązania w taki sposób, że można go używać milion razy i nigdy w ten sam sposób.” (Christopher Alexander) Powiedzenie to w wersji pierwotnej dotyczylo wzorcow budowlanych, jednak sprawdza się również w przypadku wzorcow projektowych. Jedyna roznica jest w tym przypadku to, ze rozwiązania dotycza raczej obiektow i interfejsow zamiast ścian i podlog. U podstawy obu lezy jednak po prostu rozwiązanie danego problemu.

3 Elementy wzorca projektowego
Nazwa wzorca Odzwierciedla problem, rozwiązanie i konsekwencje danego wzorca Problem Opisuje zagadnienie i kontekst wystąpienia wzorca Rozwiązanie Opisuje elementy tworzące projekt, ich relacje, odpowiedzialności oraz współpracę Konsekwencje Rezultaty zastosowania wzorca – korzyści i straty * nazwa – wzbogaca słownictwo; ulatwia kontaktowanie się w grupie, z zespolem, w dokumentacji; pozwala nam projektowac na wyższym szczeblu abstrakcji (nie zagłębiamy się dokladnie do szczegółów, ale uzywamy rozwiązań już przygotowanych) * problem – kiedy należy uzyc danego wzorca; czasami opisuje również liste warunkow, które musza być spełnione zanim będziemy mogli uzyc wzorca * rozwiązanie – nie opisuje konkretnego projektu lub implementacji, ponieważ wzorzec jest tylko szablonem, który może być uzyty w roznych sytuacjach; zapewnia abstrakcyjny opis problemu i generalnego uprzadkowania elementow rozwiązujących go (w naszym przypadku będą to klasy i obiekty) * konsekwencje – sa bardzo wazne, aby oszacowac alternatywy projektu oraz aby zrozumiec zalety i wady uzycia danego wzorca. Jeżeli chodzi o software to musimy się pogodzic z utrata czasu i pamieci. Konsekwencje opisuja również wpływ wzorca na elastyczność, rozszerzalnosc i przenaszalnosc systemu.

4 Czym jest wzorzec projektowy?
„Opisem komunikujących się obiektów i klas, które są specjalnie wykonane, aby rozwiązać ogólny problem przy dokładnie określonym kontekście” (GangOfFour, 1994) „Powracającym rozwiązaniem zagadnień projektowych, z którymi wciąż się spotykamy” (Alpert, 1994) „Zbiorem reguł opisujących, w jaki sposób osiągnąć pewne cele w dziedzinie programowania” (Pree, 1994) Wzorce definiuja klasy i obiekty uzywane jako instancje, ich role, ich wspolprace, ich dystrybucje i odpowiedzialności. Każdy wzorzec skupia się na dokladnie określonym problemie projektowym lub zagadnieniu. Caly pomysl wzorca jest prosty: uzywamy go w zyciu codziennym, kiedy mowimy, ze cos jest do czegos innego podobne, lecz zawiera pewne roznice. To samo dzieje się w programowaniu, kiedy tłumaczymy koledze w jaki sposób rozwiązaliśmy jakis konkretny problem, po to tylko, żeby on nie musial robic tego od początku;

5 Katalog wzorców Przeznaczenie Konstrukcyjne (Creational) Strukturalne
(Structural) Behawioralne (Behavioral) Zakres Klasa Factory Method Adapter Interpreter Template Method Obiekt Abstract Factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Proxy Chain of Responsibility Command Iterator Mediator Memento Flyweight Observer State Strategy Visitor Wzorce różnią się pod względem rozdrobnienia i poziomu abstrakcji; aby latwiej było je sklasyfikowac wzorce dzieli się na grupy spełniające podobne funkcje. Przeznaczenie opisuje co dany wzorec robi. Natomiast zakres mowi czy wzorzec dotyczy glownie klas czy obiektow. Wzorce o zakresie klasy zajmuja się powiązaniami miedzy klasami i ich podklasami. Związki te sa tworzone przez dziedziczenie, wiec sa statyczne (tworzone na etapie kompilacji). Wzorce o zakrasie obiektowym dotycza powiązań miedzy obiektami, które mogą być zmieniane w biegu programu (sa dynamiczne).

6 Klasyfikacja wzorców Konstrukcyjne (Creational)
Dotyczą procesu tworzenia obiektu Strukturalne (Structural) Dotyczą struktury klas lub obiektów Behawioralne (Behavioral) Charakteryzują sposób, w jaki klasy lub obiekty oddziałują i dzielą odpowiedzialności * creational – obejmuje to również izolowanie szczegółów tworzenia obiektu, aby nasz kod nie był zalezny od typow obiektow i nie musial być zmieniany kiedy dodamy nowy typ * strukturalne – zajmuja się metodami powiązań miedzy obiektami aby zagwarantowac niezależność powiązań od zmian w systemie

7 Zasady projektowania Nie staraj się zadziwić innych
Rzeczy oczywiste rób w sposób oczywisty „Nie rozmawiaj z nieznajomym” Projekt jest skończony, jeżeli już nic więcej nie da się z niego usunąć Prostota przed ogólnością „Izomorfizm”: jeden obiekt abstrakcyjny – jedna klasa Unikaj powielania kodu rozwiązanie ma być latwo zrozumiane dla innych – nie udziwniane „nie rozmawiaj ...” – obiekt powinien odwoływać się tylko do siebie, swoich atrybutow i argumentow swoich metod prostota... – należy unikac rozwiązań ogolnych, które mogą nadawac się „do wszystkiego”, z wyjątkiem sytuacji, gdy celem rozwiązania jest ogólność (np. budowanie bibliotek potrzebnych wielu użytkownikom) Kazde pojecie powinno być reprezentowane przez pojedyncza klase i na odwrot unikaj powielania kodu – unikac powielania kodu wykonującego te same funkcje (np. jeżeli opisujemy te sama metode sortowania roznych obiektow, powinniśmy wykorzystac jeden wspolny kod). Natomiast nie należy tegto robic za wszelka cene

8 Opis wzorca projektowego
Nazwa wzorca i klasyfikacja Krótko ukazuje istotę wzorca Intencja Co dany wzorzec robi? Do jakiego zagadnienia lub problemu się odnosi? Motywacja Ukazuje problem i sposób, w jaki struktury klas i obiektów go rozwiązują Stosowalność W jakich sytuacjach dany wzorzec może być wykorzystany?

9 Opis wzorca projektowego c.d.
Struktura Graficzna reprezentacja klas we wzorcu Elementy Klasy i obiekty uczestniczące w strukturze wzorca, oraz ich odpowiedzialności Powiązania Jak powiązane są elementy struktury? Konsekwencje Jakie są skutki użycia danego wzorca?

10 Opis wzorca projektowego c.d.
Implementacja Ogólne wskazówki i techniki programowania, o których powinniśmy wiedzieć Uwzględnienie specyfiki języka Przykładowy kod Fragmenty kodu ilustrujący przykładową implementację

11 Wzorce konstrukcyjne (Creational patterns)
Fabryka (Factory Method) Fabryka Abstrakcyjna (Abstract Factory) Singleton Prototyp (Prototype) Budowniczy (Builder)

12 Wzorce konstrukcyjne Zajmują się tworzeniem instancji obiektów
Uniezależniają program od obiektów, które tworzą Obudowują wiedzę na temat konkretnych klas, które nasz system używa Ukrywają sposób, w jaki instancje tych klas są kreowane Pozwalają na wprowadzenie większej elastyczności do kodu naszego programu ważne żeby program nie zależał od tego w jaki sposób obiekty sa tworzone i ułożone. W Javie najprostszym sposobem tworzenia instancji obiektu jest przy uzyciu operatora New. Ale taki sposób bedzie się sprowadzal do wkodowania obiektu „na sztywno”. Natomiast w wielu przypadkach, natura obiektu, który ma być utworzony zalezy od potrzeb naszego programu i wydzielenie takiego kreatora instancji może być bardzo pomocne

13 Fabryka (Factory Method)
Intencja Wzorzec ten, w zależności od dostarczonych danych, zwraca instancję jednej z możliwych klas Wszystkie zwracane klasy mają zazwyczaj wspólnego przodka i wspólne metody, jednak każda z nich wykonuje swoje zadania w inny sposób Stosowalność Gdy klasa nie może przewidzieć, jakiej klasy obiekty powinna stworzyć Gdy wpływ na rodzaj tworzonego obiektu mają dane

14 Fabryka – przykładowy kod
public class Osoba { public String plec; //K (kobieta) lub M (mężczyzna) public String jakaPlec() { return plec; } } public class Kobieta extends Osoba { public Kobieta() { System.out.println(„Dzien dobry Pani”); } public class Mezczyzna extends Osoba { public Mezczyzna() { System.out.println(„Dzien dobry Panu”); } public class Powitanie { public static void main(String[] args) { Powitanie dziendobry=new Powitanie(); dziendobry.kto(arg[0]); public Osoba kto(String plec) { if (plec.equals(”K”)) return new Kobieta(); if (plec.equals(”M”)) return new Mezczyzna(); else return null; Chcemy wypisac na wyjscie powitanie w zaleznosci od plci osoby.

15 Fabryka – struktura, konsekwencje
Tworzenie obiektów w klasie z fabryką jest bardziej elastyczne niż tworzenie ich bezpośrednio Łączy logicznie klasy opisujące pojęcia równoległe Wada: klient musi wytworzyć podklasę kreatora (KonkretnyKreator) czasami tylko po to, żeby uzyskać KonkretnyProdukt Produkt KonkretnyProdukt Kreator Fabryka() Operacja() KonkretnyKreator produkt=Fabryka() return new KonkretnyProdukt Produkt (klasa Osoba)– klasa obiektow, który fabryka tworzy KonkretnyProdukt (konkretny obiekt klasy Kobieta lub klasy Mezczyzna) Kreator (klasa Powitanie) – posiada metode Fabryka (czyli kto) i Operacja (czyli main); w kreatorze musimy wskazac KonkretnychKreatorow, którzy zwroca KonkretnyProdukt w zależności od danych KonkretnyKreator (klasa Kobieta, klasa Mezczyzna) – tworzy obiekt (klasy Kobieta lub Mezczyzna) Konsekwencje – bardziej elastyczne ponieważ w Fabryce kreatora (u nas metoda kto) można umieścić jakas inna dodatkowa funkcjonalność łączy logicznie – klasy tj. kobieta, mezczyzna... dziecko pies itp. (która dziedzicza z tego samego przodka Produktu) laczy dodatkowo rownolegle pojecia;

16 Fabryka Abstrakcyjna (Abstract Factory)
Intencja Dostarcza możliwość tworzenia rodzin zależnych lub spokrewnionych obiektów bez opisywania konkretnych klas Motywacja Załóżmy, że dostarczamy narzędzia do budowy interfejsu użytkownika, w którym użytkownik może zmieniać jego wygląd pomiędzy kilkoma standardami, np. Windows i RedHat Linux Programowanie aplikacji powinno być niezależne od wyglądu, aby mogło być przenaszalne i łatwo rozszerzalne Fab. Abs. Znajduje się jeden poziom abstrakcji wyzej niż fabryka; podczas gdy fabryka zwraca jedna z kilku podklas – fab. Abs. Zwraca Fabryke

17 Fabryka Abstrakcyjna – przykładowy kod
public abstract class Okno { /*...*/ } public abstract class Suwak{ /*...*/ } public abstract class SystemOkien { public abstract Okno utworzOkno(); public abstract Suwak utworzSuwak(); } public class WindowsOkno extends Okno { /*def Okna w systemie Windows*/ } public class WindowsSuwak extends Suwak { /*def Suwaka w systemie Windows*/ } public class WindowsSystem extends SystemOkien { public Okno utworzOkno() { return new WindowsOkno(); public Suwak utworzSuwak() { return new WindowsSuwak(); public class RedHatOkno extends Okno { /*def Okna w systemie RedHat*/ } public class RedHatSuwak extends Suwak { /*def Suwaka w systemie RedHat*/ } public class RedHatSystem extends SystemOkien {/*analogicznie do WindowsOkna*/} Uzycie: Tworze nowa metode a w niej warunki – jezeli parametr = windows to generuje nowy obiekt new WidowsSystem i tak dalej (jak w Fabryce) Rozwiazujemy nasz problem przez zdefiniowanie abstrakcyjnej klasy SystemOkien, która dostarcza interfejs do kreowania roznych rodzajow narzedzi (tutaj okno, suwak). Dla każdego rodzaju narzędzia (okna, suwaka) istnieje również klasa abstrakcyjna, której konkretne podklasy implementuja narzędzia dla określonego już wygladu. SystemOkien posiada metody zwracające obiekt dla każdej abstrakcyjnej klasy narzedzi. Klient wywoluje te metody nie wiedzac, z której konkretnie klasy korzysta.

18 Fabryka Abstrakcyjna – przykładowy schemat
SystemOkien utworzOkno() utworzSuwak() WindowsSystem RedHatSystem WindowsOkno Okno RedHatOkno WindowsSuwak Suwak RedHatSuwak Klient

19 Struktura Fabryki Abstrakcyjnej
FabrykaAbstrakcyjna UtworzProdukt1() UtworzProdukt2() KonkretnaFabryka2 KonkretnaFabryka1 Produkt1A AbstrakcyjnyProdukt1 Produkt1B Klient Produkt2A AbstrakcyjnyProdukt2 Produkt2B Wiekszosc kodu zapisana moze być w fab. Abs. I wtedy ulatwia to budowanie nowych konkretnych fabryk, które wprwadzaja tylko nowe rodziny produktow; czarne linie – dziedziczenie Czerwone strzałki – tworzenie instancji obiektu Niebieskie – wykorzystanie przez klienta (programiste) wzorca

20 Elementy Fabryki Abstrakcyjnej
FabrykaAbstrakcyjna (SystemOkien) Deklaruje interfejs dla operacji, które tworzą obiekty AbstrakcyjnyProdukt KonkretnaFabryka (WindowsSystem, RedHatSystem) Implementuje operacje do tworzenia obiektów KonkretnyProdukt AbstrakcyjnyProdukt (okno, suwak) Deklaruje interfejs dla typu produktu KonkretnyProdukt (WindowsOkno, WindowsSuwak, itd.) Implementuje interfejs AbstrakcyjnyProdukt Klient Używa tylko interfejsów FabrykaAbstrakcyjna i AbstrakcyjnyProdukt KonkretnyProdukt – definiuje obiekt produktu który ma być stworzony

21 Fabryka Abstrakcyjna – stosowalność, konsekwencje
Gdy system powinien być niezależny od sposobu kreowania, kompozycji i reprezentacji produktów Gdy system powinien być skonfigurowany z jedną z kilku rodzin produktów Gdy chcemy dostarczyć bibliotekę klas produktów, nie ujawniając ich implementacji Konsekwencje Izoluje konkretne klasy Ułatwia wymianę rodzin produktów „izoluje konkretne klasy” – pomaga kontrolowac klasy obiektow, które aplikacja tworzy; ponieważ fabryka enkapsuluje odpowiedzialności i proces tworzenia produktow, izoluje klienta od implementacji; klient manipuluje instancjami poprzez ich abstrakcyjne postacie; nazwy klas Produktow (WindowsOkno itd.) rowniez nie pojawiaja się w kodzie klienta „ułatwia wymianę rodzin produktow” –klient latwo może wymienic wyglad z WidowsSystem na RedHatSystem i latwo dodac nowa rodzine produktow

22 Singleton Intencja Motywacja
Zapewnia, że dana klasa w każdym momencie ma tylko jedną instancję i udostępnia ją globalnie Motywacja Singleton polega na stworzeniu klasy, która przechwytuje żądania powstania liczniejszych instancji, oraz zapewnia łatwy dostęp do tej jedynej istniejącej Jedyna instancja jest rozszerzalna dla jej podklas, w których można jej używać bez modyfikacji kodu Przykłady użycia: w systemie może występować tylko jeden manager okien, jedyny punkt dostępu do baz danych, jedna kolejka do jednej drukarki Singelton – stworzenie klasy globalnej zapewni globalny dostep, ale nie będzie zatrzymywac przed tworzeniem licznych instancji obiektow. Do tego potrzebny jest singelton, w którym on SAM jest odpowiedzialny za swoja jedyna instancje. Klasa taka upewnia się, ze inne instancje nie mogą być utworzone (przez przechwytywanie żądań ich wytworzenia) i zapewnia latwy dostep do tej jedynej instancji.

23 Singleton – struktura, konsekwencje
Operacja Instance pozwala klientowi dostać się do jedynej instancji (uniqueInstance) Singleton może być odpowiedzialny za tworzenie swojej własnej unikalnej instancji Konsekwencje Kontrolowany dostęp do jedynej instancji Zredukowana przestrzeń nazw Pozwala na zwiększenie dozwolonej ilości instancji Singleton static Instance() SingletonOperation() GetSingletonData() static uniqueInstance singletonData return uniqueInstance Konsekwencje - singelton enkapsuluje jedyna instancje i trzyma kontrole nad tym jak i kiedy klient ma do niej dostep - singelton jest ulepszeniem globalnej zmiennej bo nie „zanieczyszcza” przestrzeni nazw globalnymi zmiennymi, które przechowuja wlasnie pojedyncze instancje - latwo jest zmienic zdanie i pozwolic na powstawania wiecej instancji klasy singelton; a omrocz tego, można mieć ta sama kontrole nad ilością instancji uzywanych przez aplikacje

24 Singleton - przykładowy kod
public class Singleton { /*tworzymy konstruktor protected; gdyby był private chroniłby przed tworzeniem instancji Singletonu, jednak byłoby niemożliwe tworzenie instancji jego podklas*/ protected Singleton () { // ... } static public Singleton _instance = null; /*metoda instance() zwraca jedyną instancję Singletonu; użycie: Singleton.instance()*/ static public Singleton instance() { if (null == _instance) { _instance = new Singleton(); return _instance; Konstruktor musi być protected, ponieważ jeżeli chcemy utworzyc klase rozszerzajaca to musi być dostep do konstruktora; konstruktor w klasie rozszerzajacej powinien być private aby nie dalo się mieć dostepu do konstruktora klasy rozszerzajacej (która ma dostep do konstruktora Singletonu); przy czym klient ma dostep do singletony tylko przez metode instance()

25 Prototyp (Prototype) Intencja Stosowalność
Kopiowanie instancji już istniejących i modyfikowanie ich, zamiast tworzenia całkiem nowych instancji Stosowalność Gdy proces tworzenia obiektów jest bardzo czasochłonny lub skomplikowany Gdy obiekty danej klasy mogą przyjmować tylko jeden z kilku stanów Stosowalnosc – gdy obiekty danej klasy mogą przyjmowac tylko jeden z kilku stanow (wtedy wygodniej może być utworzyc odpowiednia ilość prototypow – dla każdego stanu jeden) i przy tworzeniu nowych instancji kopiowac prototyp, zamiast recznie wprowdzac konkretny stan)

26 Prototyp – przykładowy kod
/*tworzymy kserokopię oryginału na kserokopiarce*/ public class Kartka implements Cloneable { /*metoda kseruj() jest publiczna aby udostępnić metodę protected clone() z klasy Object*/ public Object kseruj(){ try{ return super.clone(); }catch(Exeption e){ System.out.println(”Wystąpił błąd: ”+e.getMessage()); return null; } /*użycie metody kseruj()*/ public class Wyklad { public static void main(String[] args){ Kartka oryginal=new Kartka(); Kartka kopia=(Kartka)oryginal.kseruj(); Bazujemy na metodzie Object.clone() oraz na interfejsie Cloneable (który jest interfejsem pustym i pelni raczej funkcje informujaca, ze dany obiekt może być klonowany)

27 Prototyp – struktura, konsekwencje
Pozwala na dodawanie i usuwanie obiektów w czasie przebiegu programu Przyspiesza kreowanie dużych obiektów Klient Operacja() Prototyp clone() KonkretnyPrototyp1 KonkretnyPrototyp2 prototyp return kopia siebie Prototyp = Object - ukrywa... – wiec zmiejsza liczbe nazw, które klient zna - dodawania i usuwanie ... – można kopiowac obiekty w dowolnej chwili;

28 Budowniczy (Builder) Intencja Stosowalność Konsekwencje
Odseparowanie konstrukcji złożonego obiektu od jego reprezentacji, aby te same procesy konstrukcyjne mogły wytworzyć inne reprezentacje Stosowalność Gdy algorytm tworzenia złożonych obiektów powinien być niezależny od części, które tworzą obiekt i od sposobu ich łączenia Gdy proces konstrukcji powinien posiadać różne reprezentacje tworzonego obiektu Konsekwencje Pozwala na zróżnicowanie wewnętrznej reprezentacji produktu Daje lepszą kontrolę nad procesami konstrukcyjnymi Stosowalnosc – 1) zamawiajacy zamawia happyMeal i może nie znac dokladnych czesc skladowych Kontrola nad procesami konstrukcji – w odróżnieniu od innych creational patterns wzorzec Budowniczy tworzy produkty krok po kroku pod kontrola dyrektora;

29 Budowniczy – przykład kodu
/*tworzymy HappyMeal złożony z burgera (hamburger lub cheeseburger), frytek, napoju (Cola lub Fanta) i zabawki (autko lub lalka)*/ public interface Produkt { public int cena(); } /*klasa Burger pozostaje abstrakcyjna, bo cena zostanie zaimplementowana zależnie od rodzaju burgera*/ public abstract class Burger implements Produkt { public abstract int cena(); } /*klasa Cheeseburger implementuje metodę cena()*/ public class Cheeseburger extends Burger { public int cena() { return 6; } /*i tak dalej*/ public class HappyMeal { public int wyliczCene() { int suma = new Cheeseburger().cena() + new Frytki().cena() + new Cola().cena() + new Auto().cena(); } return suma; Do happyMeal możemy wrzycic raz cheesbur=gera innym razem hamburgera itd.

30 Budowniczy – struktura, elementyh
Budowniczy – interfejs KonkretnyBudowniczy – implementacja Budowniczego Dyrektor – konstruuje obiekt przy wykorzystaniu interfejsu Budowniczy Produkt – wynikowy złożony obiekt Dyrektor Buduj () Budowniczy CzescBudowy() KonkretnyBudowniczy CzescBudowy () PobierzRezultat() budowniczy Produkt Klient tworzy obiekt Dyrektora i konfiguruje z potrzebnymi obiektami Budowniczego (klient to zamawiajacy, a dyrektor to happymeal) Dyrektor zawiadamia Budowniczego o każdej czesci produktu, który jest potrzebny (happymeal żąda produktów) Budowniczy odbiera żądanie od dyrektora i dodaje czesc do produktu (new Cheeseburger()) Klient odbiera produkt od budowniczego

31 Koniec „Design Patterns” E. Gamma, R. Helm, R. Johnson, J. Vlissides
„Thinking in Patterns” B. Eckel


Pobierz ppt "Wzorce projektowe (Design Patterns)"

Podobne prezentacje


Reklamy Google