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

Podobne dokumenty
Projektowanie obiektowe. Roman Simiński Polimorfizm

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

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

Programowanie obiektowe

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Aplikacje w środowisku Java

Programowanie 2. Język C++. Wykład 3.

Wzorce projektowe. dr inż. Marcin Pietroo

Programowanie obiektowe w języku

Zaawansowane programowanie w C++ (PCP)

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

Programowanie obiektowe

C++ - [4-7] Polimorfizm

Programowanie 2. Język C++. Wykład 9.

Programowanie obiektowe

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

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

Klasy abstrakcyjne i interfejsy

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

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Technologie i usługi internetowe cz. 2

Dokumentacja do API Javy.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe i zdarzeniowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Klasy abstrakcyjne, interfejsy i polimorfizm

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Listy powiązane zorientowane obiektowo

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie Obiektowe i C++

Mechanizm dziedziczenia

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Problem Próby rozwiązania Maszyna stanów Inne zastosowania Podsumowanie. Maszyny stanów. Programowanie gier bez Unity, cz. 3.

TEMAT : KLASY DZIEDZICZENIE

Polimorfizm, metody wirtualne i klasy abstrakcyjne


Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Polimorfizm. dr Jarosław Skaruz

Podstawy Programowania Obiektowego

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie obiektowe

Wzorce projektowe. dr inż. Marcin Pietroo

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

Dziedziczenie. Tomasz Borzyszkowski

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

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

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

dr inż. Jarosław Forenc

Programowanie obiektowe

Szablony funkcji i szablony klas

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

Programowanie obiektowe

Język C++ Programowanie obiektowe

PHP 5 język obiektowy

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wprowadzenie do programowania aplikacji mobilnych

Zaawansowane programowanie w C++ (PCP)

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Java: interfejsy i klasy wewnętrzne

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

Enkapsulacja, dziedziczenie, polimorfizm

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

1) Wzorzec projektowy Adapter. Zastosowanie:

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

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

Programowanie obiektowe - 1.

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

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe

Programowanie obiektowe. Wprowadzenie

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

hierarchie klas i wielodziedziczenie

1 Atrybuty i metody klasowe

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

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

Programowanie, część I

Przykład -

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie w języku C++

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

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

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Języki i metody programowania Java. Wykład 2 (część 2)

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Konstruktor kopiujacy

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

Programowanie, część I

Przykładowa implementacja

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

Transkrypt:

Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne

Fasada Facade Pattern 2

Wzorzec Fasada Facade Pattern koncepcja 3

Wzorzec Fasada przykład Wzorzec Fasada ma dostarczyć programiście prostego interfejsu, pozwalającego na łatwe korzystanie z zasobów i usług pewnego podsystemu. Fasada ma uprościć proces korzystania ze złożonego podsystemu oraz ukryć szczegóły funkcjonowania tego podsystemu. Osiąga się to poprzez opakowanie złożonego podsystemu klasą bądź interfejsem. Ktoś, kto używa Fasada Element podsystemu Element podsystemu Element podsystemu Złożony podsystem 4

Przykładowa implementacja fasady w języku C++ 5

Wzorzec Fasada, przykład Załóżmy, że istnieje pewne API, pozwalające na rysowanie elementów okien GUI. API jest obiektowe, dostarcza szeregu klas podstawowych, ale programista ma sam poskładać sobie operacje rysowania okien z tych operacji podstawowych: klasa: APIWinFrame, obramowanie okna; klasa: APIWinInterior, wnętrze okna; klasa: APIWinIcons, ozdobniki okna. Chcemy uprościć wykonywanie tych operacji, oraz ukryć w jaki sposób są one wykonywane. Wprowadzamy klasę realizującą koncepcję fasady. Fasada pozwoli nam również w przyszłości zmienić implementację realizacji poszczególnych operacji. 6

Wzorzec Fasada, elementy złożonego podsystemu class APIWinFrame ; APIWinFrame() void draw() cout << endl << "APIWinFrame::display"; class APIWinInterior ; APIWinInterior() void draw() cout << endl << "APIWinFrame::display"; class APIWinIcons ; APIWinIcons() void draw() cout << endl << "APIWinFrame::display"; 7

Wyświetlanie okna z wykorzystaniem elementów podsystemu Uciążliwy sposób wykorzystania klas podstawowych: APIWinFrame *frame = new APIWinFrame(); APIWinInterior *inter = new APIWinInterior(); APIWinIcons *icons = new APIWinIcons();... frame->draw(); inter->draw(); icons->draw();... delete frame; delete inter; delete icons; Chcielibyśmy tak: APIWindow *win = new APIWindow();... win->show();... delete win; 8

Klasa APIWindow jako fasada Uciążliwy sposób wykorzystania klas podstawowych: APIWinFrame *frame = new APIWinFrame(); APIWinInterior *inter = new APIWinInterior(); APIWinIcons *icons = new APIWinIcons();... frame->draw(); inter->draw(); icons->draw();... delete frame; delete inter; delete icons; Obiekt stanowiący fasadę dla komponentów podsystemu Chcielibyśmy tak: APIWindow *win = new APIWindow();... win->show();... delete win; Obiekt hermetyzuje odwołania do komponentów podsystemu 9

Wprowadzamy klasę fasady pierwsza przymiarka class APIWindow APIWindow() : inter(), frame(), icons() void show() inter.draw(); frame.draw(); icons.show(); Elementy ukryte za fasadą są podobiektami tworzonymi na zasadzie kompozycji private: APIWinInterior inter; APIWinFrame frame; APIWinIcons icons; ; 10

Wprowadzamy klasę fasady przymiarka do dziedziczenia class APIWindow APIWindow() : inter(), frame(), icons() virtual void show() inter.draw(); frame.draw(); icons.show(); Jeżeli przewidujemy, istnienie obiektów klas pochodnych, należy odblokować mechanizm polimorfizmu private: APIWinInterior inter; APIWinFrame frame; APIWinIcons icons; ; 11

Fasada jako klasa bazowa dla fasad specjalizowanych class APITabletWindow : public APIWindow APITabletWindow() : APIWindow() void show() checkforresponsive(); APIWindow::show(); private: void checkforresponsive() cout << "\napitabletwindow::checkforresponsive"; ;... APIWindow * w = new APITabletWindow(); w->show(); delete w; 12

Wprowadzamy klasę fasady druga przymiarka class APIWindow APIWindow() frame = new APIWinFrame(); inter = new APIWinInterior(); icons = new APIWinIcons(); virtual void show() frame->draw(); inter->draw(); icons->draw(); virtual ~APIWindow() delete frame; delete inter; delete icons; private: APIWinFrame *frame; APIWinInterior *inter; APIWinIcons *icons; ; Przydział pamięci dla podobiektów Elementy ukryte za fasadą są podobiektami tworzonymi dynamicznie 13

Wprowadzamy klasę fasady druga przymiarka class APIWindow APIWindow() frame = new APIWinFrame(); inter = new APIWinInterior(); icons = new APIWinIcons(); virtual void show() frame->draw(); inter->draw(); icons->draw(); virtual ~APIWindow() delete frame; delete inter; delete icons; private: APIWinFrame *frame; APIWinInterior *inter; APIWinIcons *icons; ; Wywołanie akcji dla podobiektów Zwolnieni przydzielonej pamięci Uwaga destruktor powinien być wirtualny jeżeli przewidujemy definiowanie klas potomnych 14

Przykładowa implementacja fasady w języku Java 15

Wzorzec Fasada, elementy złożonego podsystemu class APIWinFrame public APIWinFrame() public void draw() System.out.println( "APIWinFrame::draw" ); class APIWinInterior public APIWinInterior() public void draw() System.out.println( "APIWinInterior::draw" ); class APIWinIcons public APIWinIcons() public void draw() System.out.println( "APIWinIcons::draw" ); 16

Klasa APIWindow jako fasada class APIWindow public APIWindow() frame = new APIWinFrame(); inter = new APIWinInterior(); icons = new APIWinIcons(); public void show() frame.draw(); inter.draw(); icons.draw(); private APIWinFrame frame; private APIWinInterior inter; private APIWinIcons icons;... APIWindow w = new APIWindow(); w.show();... 17

Fasada jako klasa bazowa dla fasad specjalizowanych class APITabletWindow extends APIWindow public APITabletWindow() super(); public void show() checkforresponsive(); super.show(); private void checkforresponsive()... System.out.println( "APITabletWindow.checkForResponsive" ); APIWindow w = new APITabletWindow(); w.show(); 18

Adapter Adapter Pattern 19

Wzorzec Adapter Adapter Pattern koncepcja Problem Rozwiązanie 20

Wzorzec Adapter W programowaniu obiektowym wykorzystywane są: Adapter ma połączyć niezgodne ze sobą interfejsy. Osiąga się to poprzez opakowanie obiektu o niezgodnym interfejsie tak, aby opakowany obiekt realizował funkcje interfejsu pożądanego. Adapter bywa zatem zwany opakowaniem wrapper'em, przy czym to pojęcie pojawia się też w innych kontekstach np. przy wzorcu fasada. Ktoś kto używa Opakowanie z pożądanym interfejsem Pożądana akcja Adaptacja Niezgodny interfejs Niezgodna akcja 21

Przykładowa implementacja adaptera w języku C++ 22

Wzorzec Adapter Załóżmy, że istnieje klasa APIWindow, realizująca operacje na oknach GUI. Klasa ta pochodzi z bibliotek systemowych, nie mamy dostępu do kodu źródłowego. Chcemy, albo musimy wykorzystać obiekty tej klasy do wykonywania operacji okienkowych. Ale w naszym systemie zaplanowaliśmy zupełnie inny sposób obsługi okien, nie chcemy go zmieniać, w naszym programie służy do tego klasa MyWindow. class MyWindow MyWindow() void show()... ; Zaplanowany interfejs obsługi okien naszej aplikacji. Ale on będzie musiał działać z wykorzystaniem interfejsu klasy APIWindow. 23

Wzorzec Adapter class APIWindow APIWindow() Istniejący, działający interfejs obsługi okien. Ale on nam nie odpowiada. void displayframe() cout << "\ndisplayframe"; ; void displayinterior() cout << "\ndisplayinterior"; Ponieważ nie możemy zmodyfikować kodu klasy APIWindow, musimy odpowiednio zaprojektować własny kod. W rozważanym przypadku będzie to zaadaptowanie klasy APIWindow poprzez utworzenie opakowania obiektu tej klasy. 24

Wzorzec Adapter Interfejsy obu klas są niezgodne, należy zmodyfikować własny kod. class APIWindow APIWindow() void displayframe() cout << "\ndisplayframe"; void displayinterior() cout << "\ndisplayinterior"; ;??? class MyWindow MyWindow() void show()... ; 25

Wzorzec Adapter, pierwszy krok adaptacji Ustalamy pożądany interfejs i przygotowujemy go do adaptacji. W C++ najlepiej klasę definiującą interfejs uczynić klasą abstrakcyjną. class MyWindow MyWindow() W języku C++ klasy abstrakcyjne realizujące rolę interfejsów powinny mieć zdefiniowany destruktor wirtualny virtual ~MyWindow() virtual void show() = 0; ; Określamy pożądany interfejs obsługi okien. 26

Wzorzec Adapter, drugi krok adaptacji Tworzymy klasę Adaptera, która: będzie dziedziczyć po klasie definiującej pożądany interfejs, będzie implementować metody interfejsu, które będą kierować odpowiednie wywołania do obiektu klasy adaptowanej APIWindow, który z kolei będzie polem prywatnym klasy adaptera. class WindowAdapter : public MyWindow WindowAdapter() : MyWindow() void show() apiwin.displayframe(); apiwin.displayinterior(); private: APIWindow apiwin; ; Adapter dziedziczy po klasie docelowej Adapter implementuje interfejs klasy docelowej Adapter posługuje się obiektem klasy adaptowanej 27

Wzorzec Adapter, trzeci krok adaptacji Wykorzystujemy obiekt klasy Adaptera wszędzie tam, gdzie chcemy wykorzystać obiekt docelowej obsługi okna: int main() MyWindow * w = new WindowAdapter(); w->show(); delete w; return EXIT_SUCCESS; W sposób przeźroczysty wykorzystujemy zaadaptowany obiekt o niezgodnym interfejsie Programujemy wykorzystując pożądany interfejs 28

Wzorzec Adapter, adapter obiektowy Przedstawiony przykład prezentuje adapter obiektów pożądany interfejs uzyskuje się poprzez wykorzystanie instancji obiektu adaptowanej klasy/interfejsu. class WindowAdapter : public MyWindow WindowAdapter() : MyWindow() void show() apiwin.displayframe(); apiwin.displayinterior(); Adapter dziedziczy po klasie docelowej Adapter implementuje interfejs klasy docelowej wykorzystują odmienny interfejs obiektu adaptowanego private: APIWindow apiwin; ; Adapter posługuje się obiektem klasy adaptowanej 29

Wzorzec Adapter, adapter obiektowy,, dynamiczny Adaptowany obiekt może być tworzony dynamicznie. class WindowAdapter : public MyWindow WindowAdapter() : MyWindow() apiwin = new APIWindow(); void show() apiwin->displayframe(); apiwin->displayinterior(); ~WindowAdapter() delete apiwin; private: APIWindow *apiwin; ; Adapter dziedziczy po klasie docelowej Dlatego wirtualny destruktor w klasie bazowej był konieczny Adapter posługuje się obiektem klasy adaptowanej tworzonym dynamicznie 30

Warianty dla adaptera obiektowego Adapter obiektu pozwala na wykorzystanie obiektów klas potomnych. class APIWindow APIWindow() ; virtual void displayframe() cout << "\ndisplayframe"; virtual void displayinterior() cout << "\ndisplayinterior"; class APIDesktopWindow : public APIWindow APIDesktopWindow() : APIWindow() ; void displayframe() cout << "\napidesktopwindow::edisplayframe"; void displayinterior() cout << "\napidesktopwindow::displayinterior"; class APIMobileWindow : public APIWindow APIMobileWindow() : APIWindow() ; void displayframe() cout << "\napimobilewindow::edisplayframe"; void displayinterior() cout << "\napimobilewindow::displayinterior"; 31

Warianty dla adaptera obiektowego Adapter dobiera odpowiedni obiekt do realizacji wymaganych operacji. class WindowAdapter : public MyWindow enum WinVer DESKTOP, MOBILE ; WindowAdapter( WinVer v ) : MyWindow(), ver( v ) switch( ver ) case DESKTOP : apiwin = new APIDesktopWindow(); break; case MOBILE : apiwin = new APIMobileWindow(); break; void show() apiwin->displayframe(); apiwin->displayinterior(); ~WindowAdapter() delete apiwin; private: APIWindow *apiwin; WinVer ver; ; MyWindow * w; w = new WindowAdapter( WindowAdapter::DESKTOP ); w->show(); delete w;... w = new WindowAdapter( WindowAdapter::MOBILE ); w->show(); delete w; 32

Warianty dla adaptera obiektowego Adapter może być pasywny nie decyduje o typie obiektu adaptowanego. class WindowAdapter : public MyWindow WindowAdapter( APIWindow *win ) : MyWindow(), apiwin( win ) void show() apiwin->displayframe(); apiwin->displayinterior(); ~WindowAdapter() delete apiwin; private: APIWindow *apiwin; ; MyWindow * w; w = new WindowAdapter( new APIDesktopWindow() ); w->show(); delete w;... w = new WindowAdapter( new APIMobileWindow() ); w->show(); delete w; 33

Ogólny schemat wykorzystania adaptera obiektowego class Docelowy Docelowy() virtual void docelowametoda() = 0; virtual ~Docelowy() ; class Adaptowany Adaptowany() void adaptowanametoda() cout << "adaptowanametoda"; ; class AdapterObiektowy : public Docelowy AdapterObiektowy() : Docelowy() obiekt = new Adaptowany(); ~AdapterObiektowy() delete obiekt; void docelowametoda() obiekt->adaptowanametoda(); private: Adaptowany * obiekt; ; Docelowy * d = new AdapterObiektowy(); d->docelowametoda(); delete d; 34

Ogólny schemat wykorzystania adaptera klasowego class Docelowy Docelowy() virtual void docelowametoda() = 0; virtual ~Docelowy() ; class Adaptowany Adaptowany() void adaptowanametoda() cout << "adaptowanametoda"; ; class AdapterKlasowy : public Docelowy, private Adaptowany AdapterKlasowy() : Docelowy(), Adaptowany() ; void docelowametoda() adaptowanametoda(); Docelowy * d = new AdapterKlasowy(); d->docelowametoda(); delete d; 35

Adapter obiektowy vs adapter klasowy class AdapterObiektowy : public Docelowy AdapterObiektowy() : Docelowy() obiekt = new Adaptowany(); ~AdapterObiektowy() delete obiekt; void docelowametoda() obiekt->adaptowanametoda(); private: Adaptowany * obiekt; ; class AdapterKlasowy : public Docelowy, private Adaptowany AdapterKlasowy() : Docelowy(), Adaptowany() ; void docelowametoda() adaptowanametoda(); 36

Adapter obiektowy vs adapter klasowy, wady i zalety Adapter obiektowy: używa kompozycji obiektów, która daje możliwość adaptacji klasy oraz jej podklas (wykorzystanie polimorfizmu); brak możliwości przeciążenia metod obiektu adaptowanego. Adapter klasowy: Używa dziedziczenia, nadpisując metody klasy docelowej, dokonując translacji zachowania klasy adaptowanej. Utrudnione adaptowanie podklas klasy adaptowanej. Mogą pojawić się typowe problemy związane z dziedziczeniem wielobazowym. 37

Wykorzystanie adaptera podsumowanie Adapter jest użyteczny gdy istniejące, potrzebne nam biblioteki nie mogą być używane z powodu niezgodności z interfejsem wymaganym przez aplikację. Opracowujemy adapter gdy nie możemy lub nie chcemy zmienić interfejsu biblioteki, nie posiadamy jej kodu źródłowego. Adapter wspiera wielokrotne użycie kodu i przenaszalność kodu, pozwalając na wykorzystanie klas zupełnie niepowiązanych z realizowaną aplikacją a potencjalnie powiązanych z daną platformą systemową czy sprzętową. 38

Przykładowa implementacja adaptera w języku Java 39

Adapter obiektowy z podklasami Docelowy interfejs wg wymagań aplikacji: interface MyWindow void show(); Istniejąca klasa do zaadaptowania: class APIWindow public APIWindow() public void displayframe() System.out.println( "APIWindow::displayFrame" ); public void displayinterior() System.out.println( "APIWindow::displayInterior" ); 40

Adapter obiektowy z podklasami podklasy adaptowane class APIDesktopWindow extends APIWindow public APIDesktopWindow() super(); @Override public void displayframe() System.out.println( "APIDesktopWindow::displayFrame" ); @Override public void displayinterior() System.out.println( "APIDesktopWindow::displayInterior" ); class APIMobileWindow extends APIWindow public APIMobileWindow() super(); @Override public void displayframe() System.out.println( "APIMobileWindow::displayFrame" ); @Override public void displayinterior() System.out.println( "APIMobileWindow::displayInterior" ); 41

Adapter obiektowy z podklasami class WindowAdapter implements MyWindow public enum Version DESKTOP, MOBILE WindowAdapter( Version v ) super(); ver = v; switch( ver ) case DESKTOP : apiwin = new APIDesktopWindow(); break; case MOBILE : apiwin = new APIMobileWindow(); break; @Override public void show() apiwin.displayframe(); apiwin.displayinterior(); private APIWindow apiwin; private Version ver; MyWindow w; w = new WindowAdapter( WindowAdapter.Version.DESKTOP ); w.show(); w = new WindowAdapter( WindowAdapter.Version.MOBILE ); w.show(); 42

Adapter obiektowy ogólny schemat interface Docelowy void docelowametoda(); class Adaptowany public Adaptowany() public void adaptowanametoda() System.out.println( "adaptowanametoda" ); class AdapterObiektowy implements Docelowy public AdapterObiektowy() super(); obiekt = new Adaptowany(); public void docelowametoda() obiekt.adaptowanametoda(); private Adaptowany obiekt; Docelowy d = new AdapterObiektowy(); d.docelowametoda(); 43

Adapter klasowy ogólny schemat interface Docelowy void docelowametoda(); class Adaptowany public Adaptowany() public void adaptowanametoda() System.out.println( "adaptowanametoda" ); class AdapterKlasowy extends Adaptowany implements Docelowy public AdapterKlasowy() super(); @Override public void docelowametoda() adaptowanametoda(); Docelowy d = new AdapterKlasowy(); d.docelowametoda(); 44