Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
UML Luokkakaavio 14:41

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Ohjelmoinnin perusteet Y Python

Java kahdessa tunnissa. Jyry Suvilehto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Ohjelmoinnin peruskurssien laaja oppimäärä

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

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

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Ohjelmoinnin peruskurssien laaja oppimäärä

Kertaus: yleistys-erikoistus ja perintä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

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

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

Oliosuunnittelu. Oliosuunnittelu

TIE Ohjelmistojen suunnittelu

Ohjelmoinnin perusteet Y Python

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Ohjelmoinnin jatkokurssi, kurssikoe

UML ja luokkien väliset suhteet

Ohjelmoinnin peruskurssien laaja oppimäärä

1. Olio-ohjelmointi 1.1

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

815338A Ohjelmointikielten periaatteet

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

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

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

Luento 2. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Olio-ohjelmointi Javalla

Ohjelmoinnin peruskurssi Y1

T Henkilökohtainen harjoitus: FASTAXON

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

4. Olio-ohjelmoinista lyhyesti 4.1

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

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

18. Abstraktit tietotyypit 18.1

Analyysi, staattinen mallintaminen, kohdealueen malli ja luokkakaavio

2. Olio-ohjelmoinista lyhyesti 2.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Olio-ohjelmointi Johdanto suunnittelumalleihin. 1. Yleistä

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Mikä yhteyssuhde on?

Yhteydelle voi antaa nimen kumpaankin suuntaan Sille ei tarvise antaa lainkaan nimeä Yhteysnimen asemasta tai lisäksi voidaan käyttää roolinimiä

Hakemistojen sisällöt säilötään linkitetyille listalle.

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

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

TIE Ohjelmistojen suunnittelu

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

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

Muutamia peruskäsitteitä

Ohjelmistojen mallintaminen Olioiden yhteistyö Harri Laine 1

Olio-ohjelmointi Suunnittelumallit Adapter ja Composite. 1. Adapter

Ohjelmistotekniikan menetelmät, luokkamallin laatiminen

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

15. Ohjelmoinnin tekniikkaa 15.1

Olioiden yhteistyön mallintaminen

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


Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä

Tietorakenteet, laskuharjoitus 7,

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

P e d a c o d e ohjelmointikoulutus verkossa

Ohjelmistojen mallintaminen, mallintaminen ja UML

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

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

UML:n yleiskatsaus. UML:n osat:

Joskus yleistäminen voi tapahtua monen ominaisuuden pohjalta. Myös tällöin voi tulla moniperintätilanteita.

Rajapinta (interface)

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Ohjelmistotekniikan menetelmät, UML

Muusta kuin vesisioista

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Johdatus sovellussuunnitteluun, s99, osa3 Helsingin yliopisto;/tktl Harri Laine 1. Olioiden väliset yhteydet. Olioiden väliset yhteydet

19. Unified Modeling Language (UML)

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

9. Periytyminen Javassa 9.1

Luokka- ja oliokaaviot

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

Taulukot. Jukka Harju, Jukka Juslin

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

Javan perusteita. Janne Käki

Ohjelmoinnin peruskurssien laaja oppimäärä

Suunnittelumalleja, MVC. Juha Järvensivu 2008

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 7: Olio-ohjelmointia: UML ja suunnittelumallit Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 14. 3. 2012

Sisältö 1 UML-luokkakaaviot 2 Suunittelumallit 3 Suunnittelumallit Factory Method ja Abstract Factory 4 Suunnittelumalli Observer 5 Suunnittelumalli Composite

(ei-laajan kurssin kalvo: luento 9 sivu 3) UML-mallinnuskieli UML UML-kieli luotiin 90-luvun puolivälissä korvaamaan joukko erilaisia mallinnuskieliä, joilla oli paljon yhteistä mutta myös paljon pikku eroja. Mallinnuskielen avulla on helppo suunnitella suurempia järjestelmiä, esittää tietoa nopeasti ja pienessä tilassa, selittää asioita muillekin kuin ohjelmoijille jne. jne. Parhaan kuvan mallinnuskielestä saa kokeilemalla sitä itse joten pitemmittä puheitta... Tutustutaan luokkakaavioon 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 4) UML luokkakaavio class Nelio(object): Nelio def init (self, yl,... self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol def laske_pinta_ala(self):... def aseta_vari(self, c):... 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 5) UML luokkakaavio class Nelio(object): Nelio +laske_pinta_ala() : int +aseta_vari(c: väri): def init (self, yl,... self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol def laske_pinta_ala(self):... def aseta_vari(self, c):... 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 6) -yla_laita -ala_laita -vasen_laita -oikea_laita UML luokkakaavio class Nelio(object): Nelio :Viiva :Viiva :Viiva :Viiva def init (self, yl,... self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol def laske_pinta_ala(self):... +laske_pinta_ala() : int +aseta_vari(c:väri): def aseta_vari(self, c):... 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 7) UML luokkadiagrammi class Nelio(object): -ylalaita -alalaita -vasenlaita -oikealaita Nelio :Viiva :Viiva :Viiva :Viiva def init (self, yl,... _self.yla_laita = yl _self.ala_laita = al _self.vasen_laita = vl _self.oikea_laita = ol def laske_pinta_ala(self):... +laske_pinta_ala() : int +aseta_vari(c:väri):void näkyvyysmääreet + public - private # protected default def aseta_vari(self, c):... muuttujan, parametrin tai paluuarvon tyyppi kaksoispisteen jälkeen 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 8) UML-luokkakaaviot Suunittelumallit Factory Observer Composite Yhteyssuhde (assosiation) Nelio Viiva class Nelio(object): Suhteen suunta def init (self,yl, al, vl, ol): self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 9) Yhteyssuhde Nelio 1..2 4 Viiva class Nelio(object): def init (self,yl, al, vl, ol): self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol Multiplicity (kerrannaisuus) Kertoo kuinka moneen toisen luokan olioon jokin luokan olio on yhteydessä 3 tarkalleen kolme kpl 0..5 nollasta viiteen kpl 2..* vähintään kaksi kpl * Vapaavalintainen määrä Esimerkissämme yhteen neliöön kuuluu aina tasan 4 viivaa, mutta yksi viiva voi kuulua joko yhteen tai kahteen neliöön 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 10) Yhteyssuhde Nelio reunat 4 Viiva class Nelio(object): Rooli Karkeasti: kertoo mikä tämän suhteen pään merkitys on toiselle def init (self,yl, al, vl, ol): self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol päälle Viivan merkitys neliölle on, että se toimii neliön reunana. 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 11) Suhteen suunta Nelio reunat 4 Viiva Viivan kentissä ei välttämättä ole viittauksia Neliö-luokan olioihin Neliön kentissä on jollain tavalla tallessa viittauksia Viiva-olioihin class Nelio(object): def init (self,yl, al, vl, ol): self.yla_laita = yl self.ala_laita = al self.vasen_laita = vl self.oikea_laita = ol 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 12) Vahva ja löyhä kooste kuvaavat, että jokin koostuu pienemmistä osasista. Jos pääolioon kohdistetaan operaatioita, ne kohdistuvat jollain tavoin myös sen osasiin. Vahva kooste on jyrkempi kuin löyhä. Vahva kooste (composition) Nelio reunat 4 Viiva Neliö koostuu viivoista, jos neliö poistetaan viivatkin häviävät Löyhä kooste (aggregation) Pari 2 Yksilo Pari koostuu yksilöistä, jos pari purkautuu, yksilöt säilyvät silti 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 13) Riippuvuus Nelio reunat 4 Viiva +laske_pinta_ala() : int +aseta_vari(c:väri): Riippuvuus Karkeasti: Luokka käyttää toisen luokan olioita tai niiden metodeja (esim. parametreina) mutta ei säilytä viittauksia sen olioihin Väri 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 14) Perintä Kuvio Perintä Luokka perii toisen luokan ominaisuudet, ja sen olioon voidaan viitata yläluokan tyyppisen muuttujan kautta. Nelio reunat 4 Viiva 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 15) Esimerkki 2 vanhemmat Ihminen lapset * Rekursiivinen assosiaatio Luokan oliot voivat tietenkin viitata toisiin samanluokan olioihin. Esim Ihminen-luokassa voi olla viittaus muihin Ihminen-luokan olioihin. 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 16) Esimerkki Pankki Monta assosiaatiota Kahden luokan olioiden välillä saa olla myös useampia assosiaatioita, mutta tällöin kannattaa selittää mitä eri suhteet kuvaavat. 1 * Asiakas 1 omistaja * Pankkitili * * käyttöoikeus 14:43

(ei-laajan kurssin kalvo: luento 9 sivu 17) Abstrakti luokka <<abstract>> Työntekijä Abstrakti luokka Abstrakti luokka on luokka, joka toteuttaa joitakin metodeja, mutta osan metodeista kohdalla se ainoastaan toteaa että ne täytyy jonkun muun luokan toteuttaa. Abstrakti luokka on puolivalmis luokka, joka antaa vapaat kädet puuttuvien metodien toteutukselle. Kokki Poliisi 14:43

Miten UML:ää käytetään? UML:ää voi tuottaa automaattisesti koodista esim. työkaluilla Doxygen, Epydoc ja Pyreverse ja koodia voi autogeneroida (ohjelmilla tehdyistä) luokkakaavioista sisäänrakennettuna joihinkin IDEihin, erikseen esim. dia2code mutta usein käsin tehty luokkakaavio on hyödyllisempi: luokkakaavion abstraktiotaso kannattaa valita sen mukaan, mitä sillä haluaa kertoa (ei kaikkia kenttiä ja metodeja) kaaviossa voi esim. keskittyä tietyn toiminnon kuvaamiseen tai ulkoisen rajapinnan kuvaamiseen luokkakaavio on suunniteltu staattiseen olio-ohjelmointiin erityisesti Java- ja C++-koodiin (mm. näkyvyydet ovat niistä) Pythonin dynaamisia ominaisuuksia ei aina voi kuvata kunnolla UML määrittelee muitakin kaaviotyyppejä kuin luokkakaavion mm. kuvaamaan metodikutsujen etenemistä tietyssä käyttötapauksessa (sequence diagram)

UML-esimerkki gedit-2.30.4/docs/class-diagram.dia (osa)

Sisältö 1 UML-luokkakaaviot 2 Suunittelumallit 3 Suunnittelumallit Factory Method ja Abstract Factory 4 Suunnittelumalli Observer 5 Suunnittelumalli Composite

(ei-laajan kurssin kalvo: luento 10 sivu 2) Suunnittelumalli Mikä on suunnittelumalli (Design Pattern) Suunnittelumalli on tiiviisti esitetty yleinen kuvaus jostakin toimivasta ratkaisusta yleiseen ongelmaan. Suunnittelumallien ideoita voi käytettäessä soveltaa vapaasti. Malleja voi myös yhdistellä, ja niin usein tehdäänkin. Vertailukohtana voi ajatella vaikkapa erilaisia puuliitostapoja, tanssiliikkeitä, Niksi-pirkan vinkkejä jne. Suunnittelumalli kuvaa yleisen ratkaisutavan ja sovellusalue lopulta määrää sen kuinka mallia kulloinkin käytetään. 12:22

Sunnittelumallit ja olio-ohjelmointi yleensä suunnittelumallit liittyvät olio-ohjelmointiin useimmiten Java/C++-tyyppiseen: on rajapintoja, ei moniperintää, ei ensimmäisen luokan funktioita tai metodeja, ei dynaamisuutta suunnittelumallin idea toki toimisi muuallakin, mutta käytännössä niitä ei kovin usein näe yhtä vakiintunutta terminologiaa tai esitystapaa ei ole jotkut abstraktit funktiot (esim. fold-left) ovat mallien kaltaisia, mutta suoraan koodina monet tavallisimmista suunnittelumalleista ovat ratkaisuja juuri olio-ohjelmointiin liittyviin ongelmiin joskus esim. ensimmäisen luokan funktiolla tai muuten ei-olio-ohjelmoinnilla saisi tehtyä helpomman ratkaisun mutta varsinkin puhtaassa olio-ohjelmoinnissa suunnittelumalleista on paljon hyötyä

(ei-laajan kurssin kalvo: luento 10 sivu 3) Gang of Four Patterns Seuraavaksi käydään läpi joitakin kirjassa Gamma, Helm, Johnson, Vlissides : Design Patterns Elements of Reusable Object-Oriented Software, 1995 esiteltyjä suunnittelumalleja. Tässä kirjassa esitettyjä malleja kutsutaan yleisesti nimellä Gang-of-Four (GoF) patterns kirjan neljän kirjoittajan mukaan. Seuraavat kalvot perustuvat k.o. kirjaan. 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 25) Iterator Monesti jonkin tietorakenteen kaikki alkiot tulisi käydä läpi (vaikkapa tallentaa tiedostoon) Tietoa voi kuitenkin olla monenlaisissa rakenteissa: puita, listoja, verkkoja jne. Iterator-rajapinta mahdollistaa rakenteen läpikäynnin ilman että sitä käyttävän tarvitsee tuntea rakenne Koska Pythonissassa on valmis rajapinta tälle (for..in..), kannattaa tätä mallia käyttävän aina käyttää mainittua rajapintaa. 12:22

Sisältö 1 UML-luokkakaaviot 2 Suunittelumallit 3 Suunnittelumallit Factory Method ja Abstract Factory 4 Suunnittelumalli Observer 5 Suunnittelumalli Composite

(ei-laajan kurssin kalvo: luento 10 sivu 7) Factory Method(function) Tehdasmetodi on metodi, jota käytetään olion luontiin Olion luokan nimeä ei tarvitse tietää, riittää kun tunnetaan rajapinta Käytännössä metodi toimii kuten olion luonti, palauttaen viittauksen halutun tyyppiseen olioon Voidaan toteuttaa kutsumalla konstruktoria metodin sisällä Voidaan palauttaa jokin olemassaoleva halutun tyyppinen olio Voidaan tehdä temppuja oliolle ennen kuin se palautetaan 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 8) Factory Method Factory method mallia käytetään mm. kun: metodia kutsuva luokka ei itse voi tietää minkä aliluokan olion se haluaa luoda kun luotavat oliot halutaan parametrisoida ennalta kutsuvasta luokasta riippumatta esim. asetetaan käyttöliittymän nappuloille haluttu väri ja teksti automaattisesti. Asetukset tarvitsee säätää vain kerran kun olioita halutaan laskea, käytöstä poistettuja olioita kierrättää jne. Kierrätys - Konstruktorin kautta ei voi tarjota jo aiemmin luotua oliota -> tehdasmetodin kautta voi 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 9) Factory Method class CardFactory( object ): def new_card( self, rank, suit ): if rank == 1: return Ace( rank, suit ) elif rank in [ 11, 12, 13 ]: return FaceCard( rank, suit ) else: return Card( rank, suit ) class Deck( object ): def init ( self ): factory= CardFactory() for suit in range(4): for rank in range(13): self.cards = factory.new_card(rank+1, suit) 12:22

Abstract Factory hieman laajempi suunnittelumalli Abstract Factory käyttää apuna edellistä siinä on useita erilaisia tehdasluokkia, ja niillä on yhteinen abstrakti yläluokka (jossa tehdasmetodi) usein kukin tehdasluokka tekee omanlaisiaan (eli eri aliluokan) olioita joskus samassa tehtaassa on useita tehdasmetodeita eri tarkoituksiin esimerkki: bouncy-0.6.20071104 pyglyph/font.py abstraktin luokan BaseFontFactory metodi get_font tekee uuden FontInstance:n abstraktin luokan perii LocalFontFactory jonka get_font hakee fontteja.ttf-tiedostoista tässä abstraktilla tehdasluokalla on vain yksi perillinen, ja siinä vain yksi tehtaan tuottama fonttiluokka: FontInstance:lla voisi olla aliluokkiakin

Sisältö 1 UML-luokkakaaviot 2 Suunittelumallit 3 Suunnittelumallit Factory Method ja Abstract Factory 4 Suunnittelumalli Observer 5 Suunnittelumalli Composite

(ei-laajan kurssin kalvo: luento 10 sivu 30) Observer Observer Observer mahdollistaa toiminnan, jossa muutos yhdessä oliossa aiheuttaa automaattisesti muutoksen kaikissa siitä riippuvissa olioissa Riippuvat oliot vain pyytävät kiinnostavaa oliota kertomaan muutoksista Käytännössä kiinnostavalla oliolla on lista johon kiinnostuneet (Listener, Observer) voivat ilmoittautua Kun jotain tapahtuu, käydään jokainen listallaolija läpi ja kutsutaan jokaisen kohdalla ilmoitusmetodia. Yleensä ilmoitusmetodille vielä annetaan pikku viesti (Event) joka kuvaa tapahtuneen asian Kuunneltavan ei tarvitse tietää kuuntelijasta muuta kuin että se täyttää kuuntelija -rajapinnan 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 31) Observer UML-kaavio <<interface>> Havainnoitava +lisaakuuntelija( ) +poistakuuntelija( ) +ilmoitamuutos( ) havainnoijat[] Suorittaa kaikille havainnoijille metodin ilmoitamuutos() <<interface>> Havainnoija +ilmoitamuutos() SeurattavaLuokka HavainnoijaToteutus Toteutus voi halutessaan reagoida muutokseen 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 32) Observer Observer-malli Yksi parhaista esimerkeistä Observer-mallin käytöstä on käyttöliittymien käyttämät tapahtumankuuntelijat Käytännössä mallia voidaan käyttää mihin tahansa tilanteeseen, jossa useamman paikan ohjelmassa tulee reagoida johonkin muutokseen. Tulostus päättyy Puuhun lisätään solmu Äänikanava suljetaan jne.. 12:22

Sisältö 1 UML-luokkakaaviot 2 Suunittelumallit 3 Suunnittelumallit Factory Method ja Abstract Factory 4 Suunnittelumalli Observer 5 Suunnittelumalli Composite

(ei-laajan kurssin kalvo: luento 10 sivu 19) Composite Joissakin tietorakenteissa (esim. puu) rakenteen osaset koostuvat pienemmistä osasista (lapset), jotka taas koostuvat pienemmistä osasista jne. Composite-mallissa koko rakenteelle voi suorittaa operaation tekemällä sen vain yhdelle osaselle Toteutuksessa suurempaa rakennetta ja sen osasia käsitellään samalla tavalla. Kaikki osaset täyttävät saman rajapinnan. Isomman rakenteen operaatio tehdään myös sen lapsille 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 20) Composite Esimerkki Tekstinkäsittelyohjelma, jossa kappaleet koostuvat alikappaleista ja tekstistä, jotka molemmat täyttävät rajapinnan TekstiRakenne TekstiRakenne-luokassa on metodi oikolue() Kappale-luokan oikolue kutsuu metodia oikolue() sisältämilleen Kappale-olioille ja sisältämälleen Teksti-oliolle Teksti-olio suorittaa oikoluvun normaalisti. Etuja: Koko tekstin tai osan siitä voi oikolukea kutsumalla metodia oikolue vain kerran. Muun osan koodia ei tarvitse toimia eri tavalla riippuen siitä, millaista tekstirakennetta käsitellään, koska toiminta on ulospäin samanlaista. 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 21) Composite UML-kaavio Huomaa että toteutuksessa erilaisia Komponentti-rajapinnan täyttäviä rakenteita voi olla paljon erilaisia, tai jopa vain yksi Käyttävä Luokka <<interface>> Komponentti +operaatio( ) lapset Alkio +operaatio() Komposiitti +operaatio() Suorittaa kaikille lapsille metodin operaatio() 12:22