Wzorce projektowe, część II
Przegląd zagadnień
Podczas zajęć zostaną omówione strukturalne wzorce projektowe Fasady i Adaptera oraz czynnościowy wzorzec projektowy Obserwatora.
Zajęcia zakończą się napisaniem programu wykorzystującego zdobytą wiedzę.
Adapter (1)
Zadaniem wzorca strukturalnego Adapter jest przetworzenie interfejsu zadanej klasy w taki, który może być obsłużony przez Klienta.
Podstawową korzyścią płynącą ze stosowania wzorca jest umożliwienie współpracy klasom o niekompatybilnych interfejsach.
Adapter (2)
Klasa Adaptor udostępnia klasę Adaptacja dla klasy Klient.
W efekcie dostajemy zaadaptowany IstniejacyInterfejs, który nadaje się do wykorzystania przez klasę Klient.
Fasada (1)
Fasada jest wzorcem projektowym zapewniającym dostęp do złożonego systemu przez zewnętrzny interfejs.
Fasada (2)
Wzorzec projektowy Fasady znajduje zastosowanie w aplikacjach bankowych - kiedy klient ma do czynienia z zewnętrznym interfejsem wysyłającym odpowiednie zapytania do właściwego systemu bankowego.
Model Fasady zawsze jest dwuczęściowy - składają się na niego zarządzający interfejs zewnętrzny oraz podsystemy, które wykonują zlecone przez niego zadania.
Obserwator (1)
W aplikacjach często zdarza się, że na zmianę pewnej wartości reaguje kilka obiektów. Na przykład wartość jednej zmiennej chcemy jednocześnie wyświetlać na ekranie i w przypadku zmiany zapisać do pliku. Rozwiązaniem jest wzorzec obserwatora.
We wzorcu istotne są dwa interfejsy: Obserwator oraz przedmiot obserwacji (observable). Klasy implementujące interfejs Obserwator muszą mieć metodę, za pomocą której będą „informowane” o zmianie obserwowanego obiektu. Z kolei Przedmiot musi mieć metodę, która umożliwi dodawanie obiektów, które mają reagować na zmiany w tym obiekcie.
Realizacja klasy obserwatora jest tu dowolna - nie ma znaczenia, jak obiekty te będą reagowały na zmiany w obserwowanym obiekcie.
Najważniejszy mechanizm wzorca obserwatora znajduje się w klasie obserwowanego przedmiotu.
Obserwator (2)
Interfejs obserwowanego przedmiotu wymusza implementację metody umożliwiającej dodawanie obserwatorów. Wiąże się to z koniecznością włączenia jeszcze jednej składowej - listy obserwatorów, w przykładzie zapisywanej jako tablica ListaObs typu ArrayList.
Potrzebna jest również metoda, która poinformuje wszystkie dodane obiekty obserwatorów o tym, że w obserwowanym przedmiocie coś się zmieniło. Wywołuje ona metodę Informuj() kolejno wszystkich obserwatorów zapisanych w tablicy ListaObs.
Na przykładzie, obiekty obserwatorów będą informowane o zmianach właściwości dane.
Jak widać, nie tyle obiekty obserwatorów „wypatrują” zmian w obserwowanym przedmiocie, lecz sam przedmiot informuje wszystkich obserwatorów o zmianie.
Często poza metodą dodawania obserwatorów, interfejs obserwowanego przedmiotu zawiera też metodę do usuwania obserwatorów. Ponadto metoda Informuj() może przekazywać dowolny parametr - na przykład wartość zmiennej lub komunikat.
Podsumowanie
Zaprezentowany przegląd wzorców projektowych ma na celu zainteresowanie uczestników kursu bardzo ważnym elementem inżynierii programowania.
Przedstawione intuicje wzorców strukturalnych i czynnościowych pokazują, w jaki sposób można wykorzystać pewien rodzaj standaryzacji kodu do tworzenia bardziej skomplikowanych struktur i powiadamiania o zmianach w ich zachowaniu.
Pytania sprawdzające
Omów wzorzec Obserwatora.
W jaki sposób wzorzec Adaptera może dostosować interfejs dla klasy Klienta?
Laboratorium
1. Napisz program symulujący pracę bankomatu oraz banku internetowego, oparty na szerszym systemie obsługującym bank. Wykorzystaj wzorce Fasady i Obserwatora.
L
L