Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Podobne dokumenty
1) Wzorzec projektowy Adapter. Zastosowanie:

Wzorce projektowe. dr inż. Marcin Pietroo

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wypożyczalnia VIDEO. Technologie obiektowe

Przykładowa implementacja

Dokumentacja do API Javy.

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Interfejsy i klasy wewnętrzne

Decorator (dekorator)

Wprowadzenie do programowania aplikacji mobilnych

Wzorce projektowe. dr inż. Marcin Pietroo

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Pakiety i interfejsy. Tomasz Borzyszkowski

Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Wzorce projektowe Michał Węgorek

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

Builder (budowniczy) Cel: Przykład:

Technologie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe

Zaawansowane programowanie obiektowe - wykład 5

Aplikacje RMI

Aplikacje w środowisku Java

Programowanie obiektowe - 1.

Programowanie obiektowe

Testowanie oprogramowania Wzorce projektowe

Projektowanie obiektowe Wzorce projektowe. Gang of Four Wzorce rozszerzeń

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016


Wzorce logiki dziedziny

Programowanie w języku Java WYKŁAD

Podstawy Programowania Obiektowego

Modelowanie i Programowanie Obiektowe

problem w określonym kontekście siły istotę jego rozwiązania

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Polimorfizm. dr Jarosław Skaruz

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Klasy abstrakcyjne i interfejsy

Wzorce projektowe. dr inż. Marcin Pietroo

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Technologie i usługi internetowe cz. 2

Wywoływanie metod zdalnych

Java: interfejsy i klasy wewnętrzne

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Diagramy klas. dr Jarosław Skaruz

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Współbieżność w środowisku Java

Projektowanie obiektowe Wzorce projektowe

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Command (action, transaction, polecenie)

Wzorce projektowe. Wstęp

Wykład 8: klasy cz. 4

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Aplikacje RMI Lab4

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Projektowanie obiektowe oprogramowania Wykład 5 wzorce strukturalne Wiktor Zychla 2016

PHP 5 język obiektowy

Wywoływanie metod zdalnych

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Technologia Programowania 2016/2017 Wykład 5

Definiowanie własnych klas

Wykład 7: Pakiety i Interfejsy

Perspektywa obiektowości

Projektowanie obiektowe. Roman Simiński Polimorfizm

Wzorce projektowe i refaktoryzacja

Wzorce projektowe. dr Jarosław Skaruz

Programowanie obiektowe

Technologia Programowania 2016/2017 Wykład 4

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

PARADYGMATY PROGRAMOWANIA Wykład 4

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Język programowania. Andrzej Bobyk

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Remote Method Invocation 17 listopada 2010

Transkrypt:

Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół zrozumiały dla faktycznego wykonawcy poleceń. Pozwala dopasować interfejs istniejących obiektów do interjefsu wymaganego przez bieżącą implementację, bez zmiany kodu klas istniejących obiektów. Często porównywany do różnego rodzaju przejściówek. Adapter: diagram Adapter: struktura

Adapter: struktura Adapter: komentarz Składa się z trzech podstawowych klas: Target: interfejs, którego oczekuje klient Adaptee: obiekt dostarczający żądanej przez klienta funkcjonalności, ale niezgodny pod względem typu / interfejsu Adapter: implementuje typ Target, tłumaczy wywołania metody należącej do typu Target na wykonanie innej metody/metod w klasie Adaptee. Dzięki temu klient współpracuje z obiektem Adapter o akceptowanym przez siebie interfejsie Target, jednocześnie wykorzystując funkcjonalność dostarczoną przez Adaptee. Istnieje także wersja wykorzystującą dziedziczenie w relacji Adapter-Adaptee. Jednak wersja ta ma pewne niedogodności: powiązania między obiektami są ustalane w momencie kompilacji i nie mogą ulec zmianie ponadto, język programowania musi umożliwiać stosowanie wielokrotnego dziedziczenia lub dziedziczenia i implementacji interfejsu (jak w przypadku języków Java i C#). Adapter: implementacje Wtorzymy klasę, która implementuje wymagany interfejs, a następnie zapewniamy jej komunikację z klasą, która ma inny interfejs. Istnieją dwa sposoby realizacji, przez: dziedziczenie: z klasy, która ma niezgodny interfejs wywodzimy klasę pochodną i dopisujemy nowe metody tak, by uzyskać wymagany interfejs kompozycję: zawieramy pierwotną klasę wewnątrz nowej i tworzymy metody wymaganego interfejsu realizujące wywołania metod klasy wewnętrznej. Adapter: implementacje kompozycja public class Adoptowana { public Adoptowana() { ; public int starezad() {return 1;; public class AdapterComposition implements WymaganyIF { private Adoptowana adoptowana; public Adapter() { adoptowana = new Adoptowana(); public int nowezad {return adoptowana.starezad(); public interface WymaganyIF { public int nowezad();

Adapter: implementacje dziedziczenie public class Adoptowana { public Adoptowana() { public int starezad() {return 1; public class AdapterInherit extends Adoptowana implements WymaganyIF { public Adapter() { public int nowezad { return starezad(); public interface WymaganyIF { public int nowezad(); Dekorator: opis Rozszerza funkcjonalność obiektu poprzez dynamiczne dołączenie dodatkowych zachowań. Wzorzec ten pozwala na dekorowanie zachowania klasy, czyli zmianę jej funkcjonalności bez potrzeby dziedziczenia. Działanie podobne do dziedziczenia z tą rożnicą, że dziedziczenie rozszerza zachowanie klasy w trakcie kompilacji, a dekoratory rozszerzają klasy w czasie działania programu. Zmienia operacje dowolnego Komponentu przez użycie dodatkowego kodu w stosunku do wywoływanej przy tym operacji obiektu dekorowanego. Dekorator: zalety Dekorator: wady Zalety: dynamiczny odpowiednik dziedziczenia: większa elastyczność programowanych rozwiązań niż w przypadku dziedziczenia; obiekt można dowolnie udekorować podczas wykonania kodu rozbicie funkcjonalności: uproszczenia kodowania poprzez możliwość rozwoju szeregu klas o określonych funkcjach zamiast umieszczania wszystkich zachowań w jednym obiekcie Wady: Rozdrobnienie: projekty, w których jest używany, charakteryzują się mnogością małych podobnych do siebie obiektów, które różnią się jedynie tym jak są ze sobą połączone; zrozumienie ich funkcjonowania w celu modyfikacji może być przez to mocno utrudnione Brak identyczności obiektów: nie można korzystać z identyczności obiektow; dekorator działa jak przezroczysta otoczka, ale z punktu widzenia identyczności obiekt udekorowany nie jest taki sam jak wejściowy

Dekorator: stosowalność Dekorator: diagram w sposób jawny i dynamiczny chcemy dodać nowe zachowania do obiektu bez wpływu na pozostałe obiekty chcemy dodać nowe zachowania do obiektu, dla których istnieje możliwość, że będą zmieniane w przyszłości kiedy rozszerzanie funkcjonalności poprzez podklasy przestaje być pratyczne, np. jeżeli do hierarchii klas musimy dodać nowe podklasy zmieniające zachowania każdego liścia z danej hierarchii; w tej sytuacji lepiej stworzyć nową podklasę klasy głównej, która będzie modyfikować odpowiednie zachowania Dekorator: implementacja public interface Komponent { public void action(); public class KonkretnyKomponent implements Komponent { public void action() { /* ciało metody */ public class Dekorator implements Komponent { Komponent kompjeden = new KonkretnyKomponent(); public void action() { kompjeden.action(); Dekorator: implementacja cd public KonkretnyDekorator extends Dekorator { public void action() { super.action(); dodanametoda(); private void dodanametoda(){ /* ciało metody */

Dekorator: Starbuzz dziedziczenie Dekorator: Starbuzz dziedziczenie??? Dekorator: Starbuzz OK Fasada: opis Dostarczenie ujednoliconego sposobu dostępu do złożonego systemu poprzez wystawienie uproszczonego, uporządkowanego interfejsu programistycznego. Klienci komunikują się z systemem, wysyłając żądania do Fasady, która przekazuje je do odpowiednich obiektów systemu. Fasada może być zmuszona do tłumaczenia jej interfejsu na interfejsy komponentów podsystemu, chciaż to obiekty podsystemu wykonują właściwą pracę, Klienci wykorzystujący fasadę nie muszą mieć bezpośredniego dostępu do obiektów jej podsystemu.

Fasada: stosowalność Fasada: diagram kiedy potrzebujemy dostarczyć prostszy interfejs do złożonego podsystemu kiedy istnieje szereg zależności pomiędzy klientem a klasami implementacji abstrakcji kiedy wprowadzenie do systemu warstwy upraszczającej dostęp jest potrzebne, albo pożądane Fasada: uczestnicy Fasada: zalety Fasada: wie jakie klasy podsystemu są odpowiedzialne za spełnienie żądania; przekazuje żądania klienta do odpowiednich obiektów podsystemu Klasy podsystemu: implementują funkcje podsystemu wykonują pracę przydzieloną przez obiekt klasy Fasada nic nie wiedzą o fasadzie, to znaczy nie przechowują żadnych odwołań do niej dostarcza prostszy interfejs do rozbudowanego podsystemu bez ograniczania jego funkcjonalności osłania klienta od złożoności komponentów podsystemu dostarcza łącznik pomiędzy podsystem a jego klientów ogranicza bezpośrednie połączenia pomiędzy podsystemami, tj. każdy podsystem używa własnej Fasady i inne części systemu używają wzorca Fasady do komunikowania się z subsystemami

Fasada: przykład Most: opis Intencją wprowadzenia tego wzorca jest oddzielenie interfejsu od jego implementacji tak by oba elementy mogły istnieć niezależnie i być rozwijane niezależnie. Rozdzielenie takie pozwala niezależnie rozwijać implementowany interfejs oraz klasy implementujące ten interfejs. Most: diagram Most: uczestnicy Abstraction (BusinessObject): definiuje interfejs użytkownika abstrakcji utrzymuje odniesienie do obiektu typu Implementor RefinedAbstraction (CustomersBusinessObject): rozszerzenie interfejsu zdefiniowanego przez Abstraction Implementor (DataObject): interfejs klasy implementującej; nie musi być zgodny z Abstraction; zwykle dostarcza tylko podstawowe operacje ConcreteImplementor (CustomersDataObject): implementacja interfejsu Implementor

Most: zalety Zalety: umożliwia odseparowanie implementacji od interfejsu. poprawia możliwość rozbudowy klas ukrywanie szczegółów implementacyjnych przed klientem Stosowalność: gdy wymagane jest oddzielenie interfejsu od implementacji zarówno interfejs jak i implementacja musi zostać rozbudowana poprzez podklasy zmiany implementacyjne nie mogą mieć wpływu na klienta