wyklady IP


Klasa Składnia UML/Java Modyfikatory dostępu
Pola - atrybuty klasy public - dostępne globalnie (w UML +)
Metody - operacje klasy private - dostępne lokalnie (tylko w obrębie
klasy)
Konstruktor  określa sposób tworzenia klasy
protected - dostępne w pakiecie oraz klasach
pochodnych z innych pakietów
Klasa aktywna  klasa zawierająca metodę
static - bez konieczności tworzenia obiektu
statyczną main() (punkt wejścia programu), na
diagramie oznaczamy pogrubiona linia
final - brak możliwości zmiany
public class MainClass
public int attribute;
public class ExampleClass {
public Mainclass() {
public static final int CONSTANT = 0;
}
private int private Attribute;
public static
int friendly Attribute;
void main (String[ ]args){
}
public void public Method() {
}
}
protected void protected Method();
Klasa abstrakcyjna
}
klasa abstrakcyjna - klasa z niepełną
implementacją
Uogólnienie
metody abstrakcyjne - bez implementacji
dziedziczenie - rozszerzenie klasy bazowej
polimorfizm - przeciążanie oraz przesłanianie
abstrakcja oznaczana jest kursywa
Interfejs
interfejs - klasa całkowicie abstrakcyjna
metody - tylko deklaracje (bez implementacji)
pola - traktowane jako stałe
wszystkie elementy są automatycznie publiczne,
pola dodatkowo statyczne i ostateczne
Class BaseClass {
public void method() {
}
}
public class ChildClass
public interface interface {
extends BaseClass {
void method();
public void method() {
}
}
public void method(int arg){
Pakiet
}
pakiet - jednostka biblioteczne (grupuje klasy
}
oraz interfejsy)
package package.name;
1
Realizacja
implementacja  definiowanie metod
Kompozycja (agregacja całkowita):
związek typu całość- część
interface Interface {
agregacja całkowita (kompozycja) - relacja
void method();
wyłącznej własności (FirstClass nie może
}
istnieć bez SecondClass) oraz jedności czasu
public class ImplementationClass implements
życia (część nie może istnieć bez całości)
Interface {
public void method() {
}
}
Asocjacja
asocjacja - czasowe utrzymywanie referencji
do obiektu klasy wskazywanej przez związek
(obiekty są od siebie niezależne, ale mają do
siebie dostęp)
zwykle reprezentuje atrybut klasy
class FirstClass{}
public class SecondClass {
public FirstClass(){
}
Zależność (związek opcjonalny):
użycie  przekazywanie obiektu klasy wskazywanej
przez związek poprzez argument metody lub
powrót (zmiany w jednej klasie są uzależnione od
drugiej)
Agregacja (niecałkowita):
związek typu całość-część
agregacja - długotrwałe utrzymywanie
referencji do obiektu;
referencja przekazywana w konstruktorze lub/i
metodzie (część może należeć do wielu
całości)
class FirstClass{
public class SecondClass{
class FirstClass{}
private FirstClass composition;
public class SecondClass {
public SecondClass (FirstClass c)
public FirstClass make(){
{
return new FirstClass(); } }
composition=c; } }
2
Wzorce projektowe definicja
Wzorzec identyfikuje i specyfikuje pewną abstrakcję, której poziom znajduje się powyżej poziomu abstrakcji
pojedynczej klasy, instancji lub komponentu.
wzorzec projektowy - stanowi sposób rozwiązania problemu
klasa - sposób opisu (rzeczywistości)
instancja - reprezentacja bytu
komponent - część systemu
Przegląd wzorców projektowych
GOF Patterns  23 wzorce projektowe (GOF - Gang of Four (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides))
GUI Patterns: Applet, Aplication
Testing Patterns: Test Case, Test Suite
J2EE Patterns
GOF
wzorce konstrukcyjne
wzorce strukturalne
wzorce czynnościowe
Wzorce konstrukcyjne
Określają sposoby tworzenia(inicjowania) obiektów. Oddzielają resztę programu od sposobu tworzenia i
reprezentacji obiektów.
Abstract Factory
Builder
Factory Method
Prototype
Singleton
Wzorce strukturalne
Opisują strukturę połączeń różnych klas, określając sposób dostępu tych klas (między sobą) oraz ich hierarchie.
Adapter
Bridge
Composite
Decorator
Facade
Flyweight(pyłek)
Proxy(pośrednik)
Wzorce czynnościowe
Opisują sposób interakcji klas. Dzielą funkcjonalność pomiędzy klasy tak aby dostęp do niej nie wymagał
wnikania w strukturę systemu.
Chain of Responsibility
Command (polecenie)
Interpreter
Iterator
Mediator
Memento (pamiątka)
Observer (obserwator)
State
Strategy
Template Method
Visitor
Przydatne uwagi:
dziedziczenie- definiować szczyt hierarchii dziedziczenia jako klasy abstrakcyjne lub interfejsy, które nie
dostarczają implementacji
kompozycja - stosować raczej kompozycję niż dziedziczenie
3
WZORCE KONSTRUKCYJNE
Factory Method (metoda fabrykująca)
Prosta klasa decyzyjna, która w zależności od otrzymanych danych, zwraca obiekt jednej z wielu klas
pochodnych abstrakcyjnej klasy bazowej.
(definiuje, który konkretny obiekt ma utworzyć)
Elementy:
produkt (Shape) - definiuje interfejs obiektów tworzonych przez metodę wytwórczą
produkt konkretny (Square/Circle) - implementuje interfejs produktu
twórca - deklaruje metodę wytwórczą, która zwraca obiekt produktu
twórca konkretny (ShapeFactory) - definiuje metodę wytwórczą, żeby zwracała obiekt produktu
konkretnego
Zastosowanie:
gdy klasa nie może przewidzieć, jakich klas obiekty musi tworzyć
gdy klasa chce, by to jej podklasy specyfikowały tworzone przez nią obiekty
Odmiany wzorca:
parametry są przekazywane do fabryki i określają, który z wielu rodzajów klas obiekt zwrócić
klasa bazowa jest abstrakcyjna, a wzorzec zwraca obiekt kompletnej (nie abstrakcyjnej) klasy pochodnej
(klasa abstrakcyjna zawiera metodę fabryki)
klasa bazowa zawiera podstawowe metody i tworzy obiekt klasy pochodnej tylko wtedy, gdy podstawowa
implementacja jest niewystarczająca
4
Abstract Factory (fabryka abstrakcyjna)
Dostarcza interfejsu umożliwiającego tworzenie rodzin spokrewnionych lub uzależnionych od siebie obiektów
bez konieczności określania ich konkretnych klas.
Elementy:
fabryka abstrakcyjna (GameElementFactory) - deklaruje interfejs tworzenia produktów
fabryka konkretna (KittiesAndPuzzles/KillAndDismember) - implementuje operacje tworzenia produktów
konkretnych
produkt abstrakcyjny (Obstacle/Player) - deklaruje interfejs dla pewnego rodzaju produktu
produkt konkretny (Puzzle/Kitty/NastyWeapon/KungFuGuy) - definiuje klasę obiektu będącego produktem,
który ma być utworzony przez odpowiednią fabrykę konkretną
klient (GameEnviroment) - używa jedynie interfejsów zadeklarowanych przez klasy fabryki abstrakcyjnej i
produktu abstrakcyjnego
Konsekwencje:
pomaga zapanować nad tym, jakie klasy obiektów tworzy dana aplikacja
umożliwia łatwą zmianę fabryki konkretnej używanej przez aplikację (zmiana rodziny produktów)
ogranicza używane przez aplikację klasy obiektów do jednej rodziny
dołączanie nowych rodzajów produktów związane jest ze zmianą fabryki abstrakcyjnej oraz jej wszystkich
podklas
5
Singleton
Klasa zezwalająca na utworzenie tylko jednego jej obiektu udostępnionego globalnie.
Elementy:
singleton (Singleton) - jest odpowiedzialny za tworzenie swojego jedynego egzemplarza
Szczegóły implementacji:
prywatny konstruktor (brak możliwości utworzenia obiektu klasy poprzez konstrukcję new)
statyczna metoda zwracająca instancję klasy (tylko jedna instancja)
Zastosowanie:
klasa musi mieć tylko jeden egzemplarz udostępniany klientom
Odmiany wzorca:
możliwe rozszerzenie klasy singleton w celu zwracania rozbudowanego egzemplarza podklasy
(ExtendedSingleton)
- chroniony konstruktor
- deklaracje metod w klasie bazowej
6
Builder (budowniczy)
Oddziela konstruowanie złożonych obiektów od ich reprezentacji w celu umożliwienia budowania różnych reprezentacji
obiektów za pomocą tych samych zabiegów konstrukcyjnych.
Budowniczy służy do budowania złożonych projektów.
Elementy:
kierownik (MediaDirector) - konstruuje obiekt używając interfejsu budowniczego
budowniczy (MediaBuilder) - określa interfejs abstrakcyjny do utworzenia części składowych obiektu produktu
budowniczy konkretny (BookBuilder/MagazineBuilder) - konstruuje i zestawia części produktu, definiuje i kontroluje
tworzoną przez siebie reprezentację
produkt (Media) - reprezentuje konstruowany obiekt złożony, zawiera klasy definiujące części składowe (MediaItem)
produkt konkretny (Book/Magazine)
Współpraca:
klient tworzy obiekt kierownika i konfiguruje go za pomocą pożądanego obiektu budowniczego (budowniczy
konkretny)
kierownik informuje budowniczego o potrzebie zbudowania części produktu
budowniczy przetwarza żądania kierownika i dodaje części do produktu
klient odbiera gotowy produkt od kierownika
Konsekwencje:
abstrakcyjny interfejs budowniczego ukrywa reprezentację i wewnętrzną strukturę produktu oraz sposób montowania
tego produktu, umożliwia również zdefiniowanie w zależności od potrzeb nowego rodzaju budowniczego
wzorzec oddziela kod służący do konstruowania od reprezentacji produktu
polepsza kontrolę procesu konstruowania produktu przez podział procesu tworzenia na etapy
Odmiany:
interfejs budowniczy nie musi być klasą abstrakcyjną (standardowo zawiera puste metody), co daje możliwość zmiany
implementacji tylko niektórych metod
Porównanie
Builder vs Abstract Factory:
oba wzorce zwracają obiekty związanych ze sobą klas
Abstract Factory zwraca rodzinę uzależnionych od siebie obiektów
Builder konstruuje złożony obiekt krok po kroku, na podstawie dostarczanych danych
7
Prototype (prototyp)
Tworzenie obiektu poprzez klonowanie prototypu instancji klasy. Właściwości instancji mogą być
modyfikowane za pomocą metod publicznych (w celu dostosowania obiektu do nowych potrzeb).
Elementy:
prototyp (Prototype) - deklaruje interfejs klonowania się
prototyp konkretny (FirstPrototype/SecondPrototype) - implementuje operację klonowania się
klient (Client) - tworzy nowy obiekt, prosząc prototyp o sklonowanie się
Konsekwencje:
ukrywa przed klientem klasę konkretną produktu
umożliwia specyfikowanie nowych produktów przez zmienianie wartości (skrócenie czasu powstania
obiektu w przypadku pominięcia czasochłonnego kompletowania danych)
wymaga głębokiego kopiowania podczas budowania obiektów o złożonej strukturze
ogranicza liczbę podklas odpowiedzialnych za tworzenie blizniaczych obiektów
umożliwia dynamiczne konfigurowanie aplikacji
Klonowanie w Javie:
.clone() - płytka kopia (shallow copy) - kopiowana jest tylko referencja do obiektu wskazująca na te same
dane
.deepClone() - głęboka kopia (deep clone) - należy zaimplementować samodzielnie (np. poprzez klonowanie
składowych obiektu, wywołanie konstruktora tworzącego nowe instancje składowych obiektu, lub
serializację i deserializację struktury obiektów)
Podsumowanie wzorców konstrukcyjnych:
Factory Method (fabryka) - używany do zwracania instancji jednej spośród wielu podobnych klas;
wyboru dokonuje na podstawie danych dostarczonych do fabryki
Abstract Factory (fabryka abstrakcyjna) - zwraca jedną z wielu grup klas lub fabrykę dla odpowiedniej
grupy klas
Builder (budowniczy) - składa wiele obiektów, aby zbudować nowy obiekt na podstawie dostarczonych
danych
Prototype (prototyp) - kopiuje (klonuje) istniejącą instancję klasy, zamiast tworzyć nową, kiedy
utworzenie nowej instancji byłoby bardziej skomplikowane lub czasochłonne
Singleton - zapewnia, że będzie utworzona tylko jedna instancja klasy oraz możliwe jest uzyskanie
globalnego punktu dostępu do tej instancji
8
WZORCE STRUKTURALNE
Adapter
Używany do stworzenia nowego interfejsu dla klasy adaptowanej, tak aby dostosować go do interfejsu innej
klasy.
Elementy:
cel (Target) - definiuje specyficzny dla danej dziedziny interfejs używany przez klienta
klient (AdapterClient) - współpracuje z obiektami dostosowanymi do interfejsu celu
adaptowany (Adaptee) - definiuje istniejący interfejs, który wymaga zaadaptowania
adapter (Adapter) - adaptuje interfejs adaptowanego do interfejsu celu
Warstwy:
frontend - dostępne zewnętrznie (Target, Adapter)
backend - dostępne wewnętrznie (Adaptee)
Realizacja:
poprzez dziedziczenie - dziedziczymy po klasie o niezgodnym interfejsie i dopisujemy nowe metody, aby
uzyskać wymagany interfejs (class Adapter extends Adaptee implements Target)
poprzez kompozycję - zawieramy klasę pierwotną wewnątrz nowej i tworzymy metody wymaganego
interfejsu (przypadek powyżej)
Odmiany:
adapter wzorzec klasy - realizacja przez dziedziczenie (w razie konieczności przesłanianie metod klasy
bazowej w celu nadanie nowej funkcjonalności) - związane z konkretną klasą
adapter wzorzec obiektu - realizacja przez kompozycję - możliwość adaptowania klas pochodnych (brak
związania z konkretną klasą)
adapter uniwersalny - gdy zachowany jest dostęp do metod adaptera oraz klasy adaptowanej (np. przypadek
adaptera wzorzec klasy, gry metody klasy nie są przesłaniane)
adapter dynamiczny - tworzy interfejs dla wielu różnych klas (określanie klasy przez parametr podany w
konstruktorze lub metodzie dzięki mechanizmowi refleksji - pobranie informacji o
klasie/metodach/argumentach)
Konsekwencje:
umożliwia przedefiniowanie części zachowania klasy adaptowanej
może zwiększyć elastyczność lub uprościć interfejs klasy adaptowanej
poszerza zasięg zastosowań klasy adaptowanej
9
Bridge (most)
Oddziela interfejs obiektu od jego implementacji, dzięki temu mogą być niezależne modyfikowane
Elementy:
abstrakcja (Abstraction) - definiuje interfejs klasy mostu; zarządza odwołaniem do obiektu typu Implement
rozwinięta abstrakcja (ClientService) - rozszerza interfejs zdefiniowany przez abstrakcję
implementacja (Implement) - definiuje interfejs klas implementujących adapter, który nie musi dokładnie
odpowiadać interfejsowi abstrakcji
implementacja konkretna (Implementation) - implementuje interfejs implementacji (definiuje implementację
konkretną)
abstrakcja pierwotna (Library) - definiuje adaptowany interfejs; może być to biblioteka natywna
Warstwy:
frontend - dostępne zewnętrznie (Abstraction - interfejs mostu, ClienService - klasa mostu)
middleware  adapter (Implement - interfejs adaptera, Implementation - klasa adaptera)
backend - dostępne wewnętrznie (Library - klasa adaptowana)
Konsekwencje:
pozwala zachowywać stały interfejs dla programu klienta podczas wprowadzania dowolnych zmian do
wykorzystywanych klas
umożliwia niezależne rozszerzenie klas implementujących i klasy mostu
ukrywa szczegóły implementacji przed klientem
Porównania
Bridge/Adapter
Adapter tworzy interfejs dla istniejącej klasy, tak aby wyglądał on jak interfejs innej klasy
Bridge oddziela interfejs klasy od jej implementacji, dzięki czemu można zmieniać implementację bez
potrzeby wprowadzanie zmian w kodzie, który korzysta z klasy.
10
Composite (kompozyt)
Tworzy obiekt, który jest kompozycją obiektów, z których każdy może być obiektem prostym lub kompozytem.
Elementy:
komponent (Component) - deklaruje interfejs składanych obiektów; definiuje interfejs umożliwiający dostęp
i zarządzanie komponentami
liść (Leaf) - reprezentuje obiekty będące dziećmi w składanej strukturze (elementy końcowe); definiuje
zachowanie komponentów pierwotnych w strukturze
kompozyt (Node) - przechowuje komponenty (elementy bazowe); definiuje zachowanie komponentów
złożonych - mających dzieci
klient (CompositeStructure) - manipuluje obiektami występującymi w strukturze, wykorzystujące do tego
interfejs komponentu
Konsekwencje:
definiuje hierarchie klas grupujące obiekty pierwotne i złożone (obiekty pierwotne mogą być składane w
obiekty złożone, które dalej mogą być składane rekurencyjnie)
upraszcza budowę klienta, ze względu na jednakowe traktowanie struktury prostej i złożonej
ułatwia dodawanie nowych rodzajów komponentów (nie ma potrzeby wprowadzania modyfikowania
klientów)
komplikuje wprowadzanie ograniczeń dotyczących komponentów struktury (trzeba stosowanie dynamiczną
kontrolę typów)
11
Decorator (dekorator)
Pozwala dynamicznie dodawać nowe cechy do obiektu.
Elementy:
komponent (DrinkComponent) - definiuje interfejs obiektów , do których można dynamicznie dołączyć
zobowiązania
komponent konkretny (Mug) - definiuje obiekt, do którego można dołączać dodatkowe zobowiązania
dekorator (Decorator) - zarządza odwołaniem do obiektu komponentu oraz definiuje interfejs dopasowany
do interfejsu komponentu
dekorator konkretny (Espresso/FoamedMilk/SteamedMilk) - dodaje zobowiązania do komponentu
Praktyczne zastosowanie:
dekorowanie komponentów wizualnych (np. Jcomponent)
dekorowanie komponentów nie wizualnych (np. InputStream, OutputStream)
Zastosowanie:
gdy chcemy dynamicznie i w przezroczysty sposób dodawać zobowiązania do pojedynczych obiektów
gdy przewidujemy, ze możemy chcieć wycofać zobowiązania
gdy rozszerzanie przez zobowiązanie podklas jest niepraktyczne
Konsekwencje:
wzorzec zwiększa elastyczność dodawania zobowiązań do obiektów w stosunku do statycznego
dziedziczenia (możliwe dodawanie i usuwanie zobowiązań w czasie wykonywania programu)
pozwala zastosować przyrostowe zwiększanie funkcjonalności , przez co możliwe jest unikniecie
przeładowanych właściwościami klas na szczycie hierarchii
ułatwia definiowanie nowych rodzajów dekoratorów niezależnie od rozszerzanych przez nie klas obiektów
12
Facade (fasada)
Używany do utworzenia pojedynczej klasy reprezentującej złożony system.
Elementy:
fasada (Database) - wie, jakie klasy podsystemu są odpowiedzialne za spełnienie żądania; przekazuje
żądania klienta do odpowiednich obiektów podsystemu
klasy podsystemu (Connection/DatabaseMetaData/ResultSet) - implementują funkcje podsystemu;
wykonują prace przydzieloną przez obiekt fasady; nie posiadają referencji do fasady
Właściwości:
wzorzec izoluje klienta od skomplikowanych komponentów podsystemów i dostarcza do nich prostszy
interfejs do ogólnego użytku, jednocześnie nie ogranicza zaawansowanemu użytkownikowi dostępu do
złożonych klas znajdujących się głębiej
umożliwia dokonywanie zmian w przykrywanych podsystemach bez potrzeby modyfikacji kodu klienta i
redukuje liczbę zależności podczas kompilacji
Konsekwencje:
oddziela klientów od komponentów podsystemu, dzięki czemu zmniejsza sie liczba obiektów, z którymi
klienci maja do czynienia
ułatwia ułożenie warstwami systemu i zależności między obiektami (eliminuje złożone lub cykliczne
zależności)
upraszcza przenoszenie systemów na inne platformy - zmniejsza prawdopodobieństwo przebudowywania
dużej części systemu, podczas modyfikacji jednego podsystemu
nie umożliwia aplikacjom bezpośrednio dostępu do klas podsystemu.
Porównanie
Dekorator/Fasada
fasada ukrywa złożoność systemu za prostym interfejsem
dekorator dodaje nowe funkcje poprzez obudowywanie klas
13
Flyweight (waga piórkowa/pyłek)
Stosowany dla obiektów współdzielonych. Instancja nie zawiera informacji o stanie, lecz stan jest
przechowywany na zewnątrz. Takie rozwiązanie pozwala na wydajne współdzielenie obiektów, tak aby przy
dużej liczbie instancji i przy niewielu typach obiektów zajmowały one jak najmniej miejsca.
Elementy:
stan zewnętrzny (Data) - oddziela dane od implementacji
pyłek (Flyweight) - deklaruje interfejs, poprzez który pyłki mogą otrzymywać stan zewnętrzny i
współdziałać zgodnie z nim
pyłek konkretny (SharedFlyweight/UnsharedFlyweight) - definiuje interfejs pyłku i dodaje pamięć do
przechowywania stanu wewnętrznego
fabryka pyłków (FlyweightFactory) - zapewnia właściwe współdzielenie pyłków (dostarcza istniejący lub
tworzy nowy egzemplarz pyłku)
klient (Client) - utrzymuje odwołania do pyłków oraz przechowuje ich stan zewnętrzny
Przykładowe zastosowanie:
rysowanie ikon - mapa bitowa ikony jako obiekt zewnętrzny (stan zewnętrzny)
Konsekwencje:
zastosowanie wzorca może zwiększyć czas wykonywania w związku z przesyłaniem, wyszukiwaniem lub
wyliczaniem stanu zewnętrznego
redukuje wykorzystanie (utylizację) pamięci poprzez współdzielenie stanów zewnętrznych - pamięć nie jest
zajmowana przez duplikaty tych samych danych
14
Proxy(pośrednik)
Tworzy prosty obiekt zastępujący obiekt bardziej złożony, który może być dostępny w pózniejszym czasie. Często
stosowany w programach działających w rozproszonym środowisku sieciowym.
Elementy:
pośrednik (ProxyImage) - przechowuje odwołanie (referencję), która umożliwia mu dostęp do prawdziwego przedmiotu
oraz kontroluje dostęp do niego; może być odpowiedzialny za tworzenie i usuwanie prawdziwego przedmiotu; ma
zgodny interfejs z przedmiotem
przedmiot (Image) - definiuje wspólny interfejs dla prawdziwego przedmiotu oraz pośrednika, tak aby pośrednik mógł
być używany wszędzie tam, gdzie jest oczekiwany prawdziwy przedmiot
prawdziwy przedmiot (RealImage) - definiuje rzeczywisty obiekt reprezentowany przez pośrednika
Rodzaje pośredników:
pośrednik zdalny - jest odpowiedzialny za kodowanie żądań i ich argumentów oraz za wysyłanie zakodowanych żądań
do rzeczywistych przedmiotów w innej przestrzeni adresowej
pośrednik wirtualny - może przechowywać w pamięci podręcznej dodatkowe informacje o rzeczywistym przedmiocie,
dzięki czemu może odłożyć na pózniej uzyskanie dostępu do niego
pośrednik ochraniający - sprawdza, czy wywołujący czyli klient ma zezwolenie na dostęp, wymagane do spełnienia
danego żądania
Zastosowanie:
gdy obiekt potrzebuje dużo czasu na załadowanie (np. przez sieć)
gdy prawa dostępu do obiektu mają być ograniczone (pośrednik może sprawdzać uprawnienia użytkownika)
Właściwości:
pozwala odróżnić wymaganie utworzenia instancji obiektu od rzeczywistej potrzeby dostępu do niej (obiekt może być
tworzony dopiero wtedy, gdy będzie potrzebny)
może przechowywać kopie dużych obiektów, które rzadko są modyfikowane
Konsekwencje:
wprowadza dodatkowy poziom pośrednictwa przy dostępie do obiektu
Porównanie
Adapter/Proxy
adapter oraz proxy obudowują obiekt
adapter dostarcza inny interfejs do obiektu
proxy dostarcza identyczny interfejs udając obudowywany obiekt, pośrednicząc między klientem a obiektem
Porównanie
Dekorator/Proxy
dekorator oraz proxy mają taki sam interfejs jak obudowywany obiekt
dekorator dodaje dodatkowe cechy do oryginalnego obiektu
proxy kontroluje obudowywany obiekt
15
Podsumowanie wzorców strukturalnych:
Adapter - zamienia interfejs danej klasy na inny
Bridge (most) - oddziela interfejsy klas od ich implementacji, dzięki czemu można zmieniać implementację bez
potrzeby zmian kodu klienta
Composite (kompozyt) - to kolekcja obiektów, z których każdy może być kompozytem lub obiektem typu liść
Decorator (dekorator) - obudowuje dostarczony obiekt, umożliwia dynamiczne uzupełnianie obiektów nowymi
właściwościami
Facade (fasada) - ujednolica zbiór interfejsów w podsystemie, ułatwiając użytkowanie systemu
Flyweight (waga piórkowa/pyłek) - pozwala ograniczyć liczbę małych, podobnych do siebie instancji poprzez
wyodrębnienie części danych poza klasę
Proxy (pośrednik) - dostarcza prostego obiektu w miejsce bardziej złożonego, którego utworzenie może być
odroczone w czasie
WZORCE CZYNNOŚCIOWE
Chain of Responsibility (łańcuch odpowiedzialności)
Uwalnia nadawcę żądania (kod kliencki) od konieczności powiązania żądania z jednym odbiorcą. Obiekty łańcucha
odpowiedzialności przekazują kolejno między sobą żądanie do czasu, aż zostanie ono rozpoznane i obsłużone przez jeden z
nich.
Elementy:
obsługa (HandlerBase) - definiuje interfejs obsługi żądań; może implementować odwołanie do następnika
obsługa konkretna (MessageFilter/SpamFilter) - obsługuje żądania, za które odpowiada; pozostałe żądania przekazuje
do swojego następnika
klient (ChainClient) - generuje żądanie i przesyła je do łańcucha
Właściwości:
łańcuch może być uporządkowany hierarchicznie od klas obsługujących bardziej specyficzne przypadki do klas
bardziej ogólnych
łańcuch może być nieuporządkowany, gdy klasy nie są ze sobą powiązane (klasy konkurencyjne)
nie ma gwarancji, że każde żądanie zostanie obsłużone
Struktura:
liniowa - przeglądanie od pierwszego do ostatniego elementu
drzewiasta - przeglądanie od liścia do korzenia (obiekt musi wiedzieć od którego miejsca łańcucha przekazać żądanie)
Rodzaje:
obiekty łańcucha samodzielnie obsługują żądanie
obiekty łańcucha współpracują ze sobą poprzez modyfikację żądania
Konsekwencje:
redukuje ilość połączeń pomiędzy obiektami
obiekty łańcucha są niezależne i nie posiadają informacji o innych obiektach łańcucha
ostatni obiekt łańcucha może, ale nie musi obsługiwać wszystkich żądań (żądania nieobsłużone są gubione)
16
Command(polecenie)
Nadaje żądaniu formę obiektu, pozwala na zrealizowanie dziennika poleceń i wycofanie wykonanej operacji.
Elementy:
polecenie (Command) - deklaruje interfejs do wykonywania operacji
polecenie konkretne (ConcreteCommand) - implementuje metodę execute() przez wywołanie odpowiednich
metod odbiorcy
klient (Client) - tworzy obiekt klasy polecenie konkretne i ustala jego odbiorcę
wywołujący (Invoker) - prosi polecenie o spełnienie żądania
odbiorca (Receiver/ConcreteReceiver) - wykonuje operacje w celu spełnienia żądania
Właściwości:
klient może zgłosić żądanie bez wiedzy na temat operacji (zna tylko publiczny interfejs)
uniezależnienie kodu programu od operacji (niezależność rozwijania części aplikacji)
Zastosowanie:
przechowywanie programu i interfejsu użytkownika oddzielnie od operacji
kolejkowanie poleceń, gdy zasoby nie są dostępne bezpośrednio
zapamiętywanie ostatniej operacji, gdy mamy mieć możliwość jej wycofania
Struktura:
duża liczba małych klas (zewnętrznych, wewnętrznych lub anonimowych) zawierających metodę execude
lub jedna klasa z rozbudowaną konstrukcją sterującą w metodzie execude (stosowane tylko w mało
skomplikowanych przypadkach
17
Iterator
Formalizuje sposób poruszania się po dowolnej kolekcji danych.
Elementy:
iterator (Iterator) - deklaruje interfejs dostępu do elementów i przechodzenia ich
iterator konkretny (VectorIterator) - implementuje interfejs iteratora; pamięta bieżącą pozycję przy przechodzeniu
agregatu
agregat - deklaruje interfejs tworzenia obiektów - iteratorów
agregat konkretny - implementuje interfejs tworzenia iteratora tak, aby przekazywał egzemplarz odpowiedniego
iteratora konkretnego
interface Iterator{
public boolean hasNext();
public Object next();
public void remove();
}
public class VectorIterator implements Iterator {
private Vector vector;
private int current;
private boolean removeEnabled;
public VectorIterator(Vector v){
vector = v;
current = 0;
removeEnabled = false;}
}
Typy iteratorów:
sekwencyjne:
- zwracające obiekty w kolejności występowania w kolekcji
filtrujące:
- zwracające obiekty, spełniające określony warunek
- zwracające obiekty posortowane w nietypowy sposób
Konsekwencje:
należy zwrócić szczególną uwagę na zagrożenia wynikające z dodawania lub usuwania danych podczas
przemieszczania się po kolekcji (dane zwracane przez iterator mogą być nieprawidłowe)
klasa iteratora musi mieć dostęp do struktury danych w celu jej przeglądania (poprzez metodę get zwracającą
strukturę, dziedziczenie lub implementację jako klasy wewnętrznej)
18
Mediator
Definiuje, w jaki sposób można uprościć komunikację pomiędzy obiektami z użyciem osobnego obiektu,
zapobiegając jawnym odwołaniom między nimi.
Elementy:
mediator (Mediator) - deklaruje interfejs porozumienia się z obiektami kompanów
mediator konkretny (MediatorClass) - odbiera informacje od dowolnej klasy (kompana) i decyduje, które
pozostałe klasy powinny zostać poinformowane o zaistniałym zdarzeniu
kompan (Colleague) - komponent komunikujący się z mediatorem; wysyła informacje o zdarzeniach
Diagram obiektów bez udziału mediatora
Diagram obiektów z udziałem mediatora
19
Właściwości:
tylko jedna klasa (mediator) posiada informacje o innych klasach
w przypadku modyfikacji jednej z pozostałych tylko mediator wymaga aktualizacji
Implementacja komponentu kompana:
każda klasa musi wiedzieć o istnieniu mediatora - najlepiej przekazać referencję do obiektu mediatora w
konstruktorze komponentu
podczas inicjalizacji obiektu klasy, należy poinformować mediatora o istnieniu komponentu
Implementacja mediatora:
inicjalizacja komponentów za pomocą metody .init()
interfejs obsługi zdarzenia
- każdy komponent ma swój własny interfejs dostępu do mediatora
- komponenty mają ten sam interfejs, rozróżnianie kompanów na zasadzie przeciążonych metod, gdzie jako
argument jest przekazywany typ komponentu
Konsekwencje:
zapobiega skomplikowanym powiązaniom pomiędzy klasami, kiedy operacja wykonywania w jednej klasie
musi zmienić stan obiektu innej klasy
pozwala łatwo modyfikować działania programu (zazwyczaj poprzez modyfikację klasy mediatora lub
utworzenie klasy pochodnej)
można dodawać nowe komponenty bez potrzeby modyfikowania kodu poza mediatorem
Memento (pamiątka)
Definiuje sposób zapisywania stanu obiektu bez naruszania zasad enkapsulacji.
Elementy:
zródło (Originator) - zawiera stan wewnętrzny
pamiątka (Memento) - przechowuje stan wewnętrzny obiektu zródła; chroni stan przed dostępem ze strony
innych obiektów
opiekun (Caretaker) - zarządza zapisem stanu; przechowuje instancje klasy pamiątka
Odmiany wzorca:
wzorzec może posiadać uprzywilejowany dostęp do stanu obiektu przez zastosowanie widoczności
pakietowych lub będąc klasą wewnętrzną (pozostałe obiekty poza pakietem/klasą mają dostęp ograniczony)
pamiątka przechowuje informację o instancji klasy zródła oraz dane, które będą odtwarzane za pomocą
metody restore()
Zastosowanie:
systemy udostępniające operacje wycofania zmian
Konsekwencje:
umożliwia przechowywanie stanu obiektu poza nim nie łamiąc przy tym zasad enkapsulacji
użycie pamiątek może być związane ze znacznymi kosztami związanymi z koniecznością kopiowania dużej
ilości danych
opiekun jest odpowiedzialny za usuwanie pamiątek, co może powodować duże koszty pamięciowe (opiekun
nie posiada informacji o wielkości danych przechowywanych przez pamiątkę)
20
State(stan)
Umożliwia obiektowi zmianę jego zachowania w wyniku zmiany jego stanu wewnętrznego
Elementy:
kontekst (StateContext) - utrzymuje egzemplarz podklasy stanu, definiujący bieżący stan
stan (State) - definiuje interfejs do enkapsulacji zachowania związanego z określonym stanem kontekstu
stan konkretny (LowerCaseState/UpperCaseState) - implementuje zachowanie związane ze stanem kontekstu
Konsekwencje:
wzorzec tworzy obiekty klas pochodnych klasy State dla każdego stanu, w którym może znalezć się aplikacja oraz
przełącza między nimi, gdy zmieni się stan aplikacji
eliminuje zestawy długich instrukcji warunkowych określających sposób zachowania obiektu (zachowanie obiektu,
czyli stan obiektu jest ukryty wewnątrz odpowiedniej klasy)
przed każdorazowym wykonaniem operacji nie trzeba sprawdzać stanu obiektu
generuje wiele małych klas, ale upraszcza i zwiększa czytelność kodu
Strategy (strategia)
Definiuje rodzinę obudowanych algorytmów i umożliwia ich wymianę.
Elementy:
kontekst (Context) - umożliwia wybór strategii (algorytmu) dokonywanych obliczeń
strategia (Strategy) - określa sposób wykonywania obliczeń
strategia konkretna (FirstStrategy/SecondStrategy/ThirdStrategy) - dostarcza implementacji algorytmu
Konsekwencje:
pozwala dynamicznie przełączać algorytmy w klasie kontekstu
algorytmy muszą być powiązane ze sobą hierarchicznie (przez dziedziczenie lub implementację interfejsu)
Porównanie
Strategy vs State
strategia i stan umożliwiają dokonywanie wyboru algorytmu/stanu lub może on być determinowany samoczynnie w
klasie kontekstu
tylko jedna strategia może być utworzona i aktywowana w klasie kontekstu
wiele stanów może być utworzonych jednocześnie i często mogą być przełączane
wzorzec strategia zawiera szereg algorytmów wykonujących podobne czynności
wzorzec stan zawiera klasy stanów, które wykonują całkowicie różne czynności
21
Template Method (metoda szablonowa)
Dostarcza abstrakcyjnej definicji algorytmu
Elementy:
szablon (Interest) - klasa zawierająca deklarację metody szablonowej (najczęściej abstrakcyjna)
klasa konkretna (SimpleInterest) - zawierająca implementację metody szablonowej
Rodzaje metod w klasach szablonowych:
kompletne metody, z których korzystają wszystkie klasy pochodne
abstrakcyjne metody, które muszą zostać zaimplementowane w klasach pochodnych
metody, które zawierają podstawową implementację pewnych operacji, jednak mogą być nadpisane w
klasach pochodnych (tzw. metoda uchwyt)
metody, które wywołują dowolną kombinację metod powyższych typów
Konsekwencje:
klasa bazowa może definiować jedynie część metod; reszta implementowana będzie w klasach pochodnych
w klasie bazowej mogą znajdować się metody, które wywołują sekwencje inne metody, niektóre z nich
mogą być zaimplementowane w klasie bazowej, a niektóre w klasach pochodnych
22
Observer (Obserwator)/Listener
Definiuje sposób powiadamiania o zmianach stanu obiektu.
Elementy:
obserwowany (Subject) - zna swoich obserwatorów; zapewnia interfejs dołączania i odłączanie
obserwatorów
obserwowany konkretny (SubjectClass) - gdy zmienia się stan, wysyła powiadomienie do swoich
obserwatorów
obserwator (Observer) - definiuje interfejs uaktualniania dla obiektów, które powinny być poinformowane o
zmianach, jakie zaszły w obserwowanym
obserwator konkretny (ObserverClass) - przechowuje stan, który powinien być spójny ze stanem
obserwowanego; implementuje interfejs obserwatora służący do uaktualniania, żeby zachować spójność
swojego stanu ze stanem obserwowanego
Szczegóły implementacji:
obserwowany rejestruje obserwatorów zainteresowanych wizualizacją zmian stanu obiektu
obserwowany wywołuje metodę update() na wszystkich zainteresowanych obserwatorach w celu
aktualizacji zmian stanu obiektu
Zastosowanie:
aplikacje okienkowe (reprezentacja danych)
architektura MVC
Architektura MVC (Model-View-Controller)
model - reprezentacja danych
widok - komponent wizualny
kontroler - warstwa komunikacyjna pomiędzy obiektami modelu i widoku, może być osobną klasą lub
stanowić część klasy modelu lub widoku
Konsekwencje:
umożliwia niezależne zmienianie obserwowanych i obserwatorów
obserwowany i obserwator nie są ściśle ze sobą powiązani (obserwowany zna jedynie listę
obserwatorów), więc mogą należeć do innych warstw abstrakcji w systemie
powiadomienie o zmianie jest automatycznie rozsyłane do wszystkich obserwatorów
23
Visitor (wizytator)
Pozwala na zdefiniowanie nowej operacji bez zmian w klasach elementów, do których operacja się odnosi.
Elementy:
wizytator (Visitor) - definiuje nowe operacje dla gospodarzy
gospodarz (Host) - przekazuje sterowanie do wizytatora w celu rozszerzenia funkcjonalności
Współpraca:
przejście w pętli przez wszystkich gospodarzy
wywołanie metody accept() dla każdego gospodarza
wywołanie metody visit() przez instancję gospodarza na wizytatorze
wykonanie operacji na obiekcie gospodarza
Zastosowanie:
w przypadku wykonywanie operacji na danych zawartych w dużej liczbie obiektów, które mają różne
interfejsy
w przypadku wykonywanie wielu niezwiązanych operacji na tych klasach
w przypadku dodawania funkcji do bibliotek lub szkieletów, gdy nie ma dostępu do kodu lub nie chcemy go
modyfikować
nie ma zastosowania gdy do programu będzie dodawane dużo nowych klas
Odmiany:
program przechowuje i przekazuje wszystkie instancje klas do wizytatora (powyżej)
program przekazuje całą strukturę danych do wizytatora
wizytator sam przechowuje obiekty, które wizytuje
Konsekwencje:
umożliwia pobieranie danych z wielu instancji różnych klas
wprowadza dodatkową funkcjonalność do klas bez potrzeby ich modyfikowania
posiada dostęp do danych tylko przez publiczne metody
jest mało przydatny w rozwojowej fazie programu ze względu na wielokrotne dodawanie abstrakcyjnych
metod wizytacji oraz ich implementacji dla każdej nowej klasy
24


Wyszukiwarka

Podobne podstrony:
wykład 7 IP Multimedia Subsystem I
wykład 8 IP Multimedia Subsystem II
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
mo3 wykladyJJ
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Wyklad 2 PNOP 08 9 zaoczne
Wyklad studport 8
Kryptografia wyklad
Budownictwo Ogolne II zaoczne wyklad 13 ppoz
wyklad09
Sporzadzanie rachunku przepływów pienieżnych wykład 1 i 2

więcej podobnych podstron