812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

Samankaltaiset tiedostot
Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Olio-ohjelmointi Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton. 1. Proxy (Edustaja)

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Mikä yhteyssuhde on?

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Oliosuunnittelu. Oliosuunnittelu

TIE Ohjelmistojen suunnittelu

Rajapinta (interface)

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Olio-ohjelmointi Javalla

Java kahdessa tunnissa. Jyry Suvilehto

Ohjelmoinnin jatkokurssi, kurssikoe

Olio-ohjelmointi Suunnittelumallit Observer ja State. 1. Observer (Tarkkailija)

Metodien tekeminen Javalla

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Ohjelmistojen mallintaminen, suunnittelumalleja

18. Abstraktit tietotyypit 18.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

TIE Ohjelmistojen suunnittelu

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?


812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

812336A C++ -kielen perusteet,

9. Periytyminen Javassa 9.1

Javan perusteita. Janne Käki

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjelmistoarkkitehtuurit kevät

Olio-ohjelmointi Syntaksikokoelma

5. Suunnittelumallit. TTY Ohjelmistotekniikka

12. Monimuotoisuus 12.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

14. Poikkeukset 14.1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

9. Periytyminen Javassa 9.1

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

T Henkilökohtainen harjoitus: FASTAXON

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

12. Monimuotoisuus 12.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Periytyminen (inheritance)

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VI Johdanto suunnittelumalleihin

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

2. Olio-ohjelmoinista lyhyesti 2.1

Tietorakenteet, laskuharjoitus 7,

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Kertaus: yleistys-erikoistus ja perintä

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

UML ja luokkien väliset suhteet

5. Suunnittelumallit. TTY Ohjelmistotekniikka

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

4. Olio-ohjelmoinista lyhyesti 4.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Sisältö. 2. Taulukot. Yleistä. Yleistä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

Sisältö. 22. Taulukot. Yleistä. Yleistä

1 Tehtävän kuvaus ja analysointi

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. V Geneerisyys

TIETORAKENTEET JA ALGORITMIT

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Muusta kuin vesisioista

16. Javan omat luokat 16.1

ITKP102 Ohjelmointi 1 (6 op)

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

T SEPA - päiväkirja: Design Patterns. ETL työkalu

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Transkriptio:

2015 syksy 2. vsk VII Suunnittelumallit Adapter ja Composite

Sisältö 1. Johdanto rakennemalleihin 2. Adapter (Sovitin) 3. Composite (Rekursiokooste) Suunnittelumallit Adapter ja Composite 2

VII.1 Johdanto rakennemalleihin Pääasia: miten luokkia ja olioita yhdistellään muodostamaan laajempia rakenteita Rakenteelliset luokkamallit Perustuvat periytymiseen Rakenteelliset oliomallit Perustuvat olioiden yhdistelemiseen Adapter (Sovitin) ja Composite (Rekursiokooste) rakennemalleja Suunnittelumallit Adapter ja Composite 3

VII.2 Adapter (Sovitin) Yleinen ongelma: käytettävissä luokka jonka 1. Toiminta haluttu 2. Rajapinnan käyttö mahdotonta tai hankalaa 3. Muuttaminen ei mahdollista Ongelma erityisesti uudelleenkäyttötilanteissa Ratkaisu: Kirjoitetaan sovitinluokka vanhan luokan ja uuden ohjelmakoodin väliin Adapter-suunnittelumalli Malli yleinen Javan luokkakirjastoissa Suunnittelumallit Adapter ja Composite 4

VII.2.1 Adapter-esimerkki Javasta Käyttöliittymän ikkunaluokan ikkunatapahtumien käsittelijän toteutettava rajapinta WindowListener: public void windowopened(windowevent e) public void windowclosed(windowevent e) public void windowactivated(windowevent e) public void windowdeactivated(windowevent e) public void windowiconified(windowevent e) public void windowdeiconified(windowevent e) public void windowclosing(windowevent e) Kaikki metodit toteutettava Javassa luokka WindowAdapter, tyhjät toteutukset -> perimällä tarvitsee toteuttaa vain halutut metodit Suunnittelumallit Adapter ja Composite 5

VII.2.2 Adapter: Tarkoitus ja sovellettavuus Tarkoitus (Intent) Muuntaa luokan rajapinnan asiakkaiden vaatimaan muotoon ja mahdollistaa muuten rajapinnoiltaan yhteensopimattomien luokkien yhteistoiminnan Sovellettavuus (Applicability) Valmiin, rajapinnaltaan sopimattoman luokan käyttö Luo uudelleenkäytettävän luokan toimimaan toistaiseksi tuntemattomien luokkien kanssa. On käytettävä useaa olemassa olevaa aliluokkaa, mutta ei haluta periä kaikkia. Oliosovitin voi sovittaa yliluokkansa rajapinnan Suunnittelumallit Adapter ja Composite 6

VII.2.3 Adapter: Rakenne Luokkasovitin Sovitettava luokka peritään sovitinluokkaan Kommunikoi Targetin määräämän rajapinnan kautta Sovelluskohtainen rajapinta, jonka kautta kommunikoi Clientin kanssa Sovitettava rajapinta Sovittaa Adapteen rajapinnan Targetin määräämään rajapintaan Luokkasovittimen rakenne. Ks.: Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 7

VII.2.3 Adapter: Rakenne (2) Oliosovitin Sovitettavan luokan olio osaoliona sovittimessa Oliosovittimen rakenne. Ks.: Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 8

VII.2.4 Luokkasovitin vs. Oliosovitin Perustapauksessa voidaan valita kumpi vain Tapaus 1: Luokan Adaptee aliluokissa on määritelty operaatioita, jotka on myös sovitettava. Jos joskus suoritettava aliluokan metodi, on käytettävä oliosovitinta Perittäessä luokka Adapter perii vain Adaptee-luokan toteutuksen Tapaus 2: Adapter-luokan on uudelleenmääriteltävä joitakin Adaptee-luokan toimintoja -> Käytä luokkasovitinta Aliluokassa uudelleenmäärittely helpompi toteuttaa Suunnittelumallit Adapter ja Composite 9

VII.2.5 Esimerkki Ohjelmassa luokka, muokattava merkkijonotaulukkoa class StringContainer { private: std::string* stringtable; int length; public: StringContainer(std::string* intable, int len); // Taulukon muokkaus- // metodi std::string* getmodifiedstrings() const; }; Valmis luokka, muokkaa vectoria class StringVectorModifier { public: // Metodi palauttaa // muokatun vectorin void modify( std::vector<std::string> &list); }; Suunnittelumallit Adapter ja Composite 10

VII.2.5 Esimerkki (2) Sovittimeen Target-luokka (abstrakti) class StringArrayModifier { public: }; virtual std::string* modifyarray(std::string *array, int length)=0; Adapter-luokan määrittely class VectorArrayAdapter: private StringVectorModifier, public StringArrayModifier { public: }; std::string* modifyarray(std::string* array, int length); Suunnittelumallit Adapter ja Composite 11

VII.2.5 Esimerkki (3) Adapter-luokan metodin toteutus std::string* VectorArrayAdapter::modifyArray(std::string* array, int length){ // Määrittele string-olioita sisältävä vector strings // Kirjoita taulukon array sisältämät merkkijonot // vectoriin strings // Muunna vectorin strings sisältö modify(strings); } // Luo uusi taulukko modified_table, kirjoita // vectorin strings merkkijonot siihen // ja palauta taulukko return modified_table; Suunnittelumallit Adapter ja Composite 12

VII.2.5 Esimerkki (4) Lopuksi muutos Clientia vastaavaan luokkaan: std::string* StringContainer::getModifiedStrings() const { VectorArrayAdapter va; std::string *modifiedstrings = va.modifyarray(stringtable, length); } return modifiedstrings; Suunnittelumallit Adapter ja Composite 13

VII.3 Composite Lähtöisin graafisten käyttöliittymäkomponenttien rakentamisesta Käsitellään komponenttien muodostamaa koostetta käyttöliittymässä yksittäisenä komponenttina Yleistys: Muodostetaan olioiden ryhmiä, joita halutaan käsitellä kuin yksittäistä oliota -> Composite-malli Luokkahierarkian kantaluokasta periytyy kahdenlaisia luokkia Luokat, jotka määrittelevät alkeisolioita (ei jälkeläisiä) Luokat, jotka määrittelevät yhdisteolioita: koostavat alkeisolioita monimutkaisemmiksi yhdistelmiksi Suunnittelumallit Adapter ja Composite 14

VII.3 Composite (2) Tarkoitus Järjestää oliot puuhierarkioiksi, jotka kuvaavat osakokonaisuus-suhteita Mahdollistaa niin osien kuin kokonaisuuksien yhdenmukaisen käsittelyn Sovellettavuus Mallintaa osa-kokonaisuussuhteita Asiakasolioiden voitava käsitellä sekä osia että kokonaisuuksia samalla tavalla Suunnittelumallit Adapter ja Composite 15

VII.3.1 Composite: Rakenne Käsittelee koostetta Componentin määräämän rajapinnan kautta Kaikkien komponenttien kantaluokka Primitiivisten olioiden luokka Yhdisteolioiden luokka Composite-mallin luokkarakenne. Lähde: Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley 1995 16

VII.3.1 Composite: Rakenne (2) Composite-mallin tyypillinen oliorakenne. Suunnittelumallit Adapter ja Composite 17

VII.3.4 Composite: Etuja ja haittoja Etuja Yhdistelmäolioita ja primitiivisiä olioita käsitellään yhtenäisesti -> asiakasluokan koodi yksinkertaista ja uusien komponenttien lisääminen helppoa Asiakkaan ei tarvitse tietää minkälaista oliota käsittelee Haittoja Mallin yleisyydestä ongelmia: Komponentin sisältämien olioiden tyyppien rajoittaminen vain ajonaikaisilla tyypintarkistuksilla Suunnittelumallit Adapter ja Composite 18

VII.3.5 Composite: Esimerkki // Abstrakti kantaluokka class Component { public: virtual void operation()=0; virtual void add(component *component)=0; virtual void remove(component *component)=0; virtual ~Component(){} }; // Primitiivisten olioiden luokka class Leaf: public Component { public: void operation(); void add(component *component); void remove(component *component); }; Suunnittelumallit Adapter ja Composite 19

VII.3.5 Composite: Esimerkki (2) void Leaf::operation() { std::cout << "Leaf address: " << this << std::endl; } void Leaf::add(Component *component) { throw std::runtime_error("no adding in leaf"); } void Leaf::remove(Component *component){ throw std::runtime_error("no removing from leaf"); } Suunnittelumallit Adapter ja Composite 20

VII.3.5 Composite: Esimerkki (3) // Yhdisteolioiden luokka class Composite : public Component { typedef std::vector<component*> ComponentVector; private: ComponentVector children; public: void operation(); void add(component *component); void remove(component *component); }; Suunnittelumallit Adapter ja Composite 21

VII.3.5 Composite: Esimerkki (4) void Composite::operation() { } std::cout << "Composite " << this << std::endl; ComponentVector::iterator iter; for(iter = children.begin(); iter!= children.end(); iter++) { } (*iter)->operation(); void Composite::add(Component *component) { } children.push_back(component); Suunnittelumallit Adapter ja Composite 22

VII.3.5 Composite: Esimerkki (5) void Composite::remove(Component *component){ } ComponentVector::iterator iter; iter = std::find(children.begin(), children.end(),component); if(iter!= children.end()){ } children.erase(iter); Suunnittelumallit Adapter ja Composite 23

VII.3.5 Composite: Esimerkki (6) // Asiakasohjelma int main() { Component *leaf1 = new Leaf(); Component *leaf2 = new Leaf(); Component *composite = new Composite(); composite->add(leaf1); composite->add(leaf2); composite->operation(); composite->remove(leaf2); composite->operation(); } // Tuhotaan kekodynaamiset oliot return 0; Suunnittelumallit Adapter ja Composite 24

VII.3.6 Composite-mallin toteutuksesta Lapsiluokassa tarvitaan joskus viitettä vanhempaan Huolehdittava, että rakenteen eläessä viitteet pysyvät kunnossa Vaikuttaa komponenttien jakamiseen (useamman vanhemman ylläpitäminen hankalaa) Mitä operaatioita Component-luokkaan? Jälkeläisten käsittely tarpeetonta Leaf-luokissa: Suositaanko yhtenäisyyttä vai turvallisuutta? Voidaan tehdä oletustoteutukset, jotka määritellään uudelleen Composite-luokissa Kuka tuhoaa poistettavat oliot? Ei ongelma kielissä, joissa roskienkeruu Suunnittelumallit Adapter ja Composite 25