Sunnittelumallit Harjoitustehtävät syksy 2015 / Simo Silander



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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

Olio-ohjelmointi Javalla

Ohjelmistotekniikan menetelmät, suunnittelumalleja

Ohjelmoinnin jatkokurssi, kurssikoe

T Henkilökohtainen harjoitus: FASTAXON

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Listarakenne (ArrayList-luokka)

Rajapinta (interface)

Luokan sisällä on lista

Olio-ohjelmointi Syntaksikokoelma

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

Ohjelmistojen mallintaminen, suunnittelumalleja

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

7. Näytölle tulostaminen 7.1

Java kahdessa tunnissa. Jyry Suvilehto

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Kehyspohjainen ohjelmistokehitys

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

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Mikä yhteyssuhde on?

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

18. Abstraktit tietotyypit 18.1

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

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Suunnittelumalleja, MVC. Juha Järvensivu 2008

1 Tehtävän kuvaus ja analysointi

9. Periytyminen Javassa 9.1

2. Olio-ohjelmoinista lyhyesti 2.1

9. Periytyminen Javassa 9.1

Harjoitus 4 (viikko 47)

Javan perusteita. Janne Käki

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

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

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

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

Metodien tekeminen Javalla

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

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Ohjelmoinnin perusteet Y Python

Muusta kuin vesisioista

A TIETORAKENTEET JA ALGORITMIT

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

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

16. Javan omat luokat 16.1

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

Java-API, rajapinnat, poikkeukset, UML,...

Ohjelmoinnin perusteet, kurssikoe

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

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

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

KOHDELUOKAN MÄÄRITTELY

Java-kielen perusteet

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

ITKP102 Ohjelmointi 1 (6 op)

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

Java-kielen perusteet

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

Merkkijonon tutkiminen matches-metodilla

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

UML ja luokkien väliset suhteet

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Kertaus: yleistys-erikoistus ja perintä

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

8/20: Luokat, oliot ja APIt

Osoitin ja viittaus C++:ssa

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

TIETORAKENTEET JA ALGORITMIT

JUnit ja EasyMock (TilaustenKäsittely)

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

4. Olio-ohjelmoinista lyhyesti 4.1

Sukelluskeräily. Pelihahmon liikuttaminen. Aarre ja pisteet

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

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

Javan GUI Scratchaajalle

Periytyminen (inheritance)

ITKP102 Ohjelmointi 1 (6 op)

Rutiinin muodostaminen. 2. Rutiinin muodostaminen. specification) Määrittely (specification( Määrittelyn osapuolet. Hyvän ohjelman tunnusmerkit

14. Poikkeukset 14.1

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

Transkriptio:

Sunnittelumallit Harjoitustehtävät syksy 2015 / Simo Silander Ohjelmointitehtävät koodataan pääsääntöisesti Javalla. Netistä löytyviä vapaasti käytettäviä ratkaisuja voi esittää, kunhan ne osaa selittää. 1. Factory Method: Tuubin Tehtäväpohjat-kansiossa on factorymethod.zip (NetBeans-projekti), joka sisältää koodia, jossa AterioivaOtus aterioi. Esimerkkiohjelman Juoma luodaan AterioivanOtuksen Opettajaaliluokassa. Juomanluontimetodi on tehdasmetodi. Kirjoita Opettajaluokalle kaksi rinnakkaista luokkaa, joissa kummassakin luodaan sopiva juoma. Luo testiohjelmassasi jokaista otustyyppiä oleva olio ja laita ne aterioimaan. 2. Abstract Factory: Jasper Java-koodaaja on koko opiskeluaikansa pukeutunut Adidas-merkkisiin vaatteisiin lippis ja kengät mukaan lukien. Kirjoita ohjelma, jossa Jasper pukee päällensä farmarit, t-paidan, lippiksen ja kengät. Tämän jälkeen Jasper luettelee ylpeänä, mitä hänellä on päällään (vaatekappaleet osaavat tostring-metodeissaan kertoa kaiken oleellisen itsestään). Valmistuttuaan insinööriksi Jasper siirtyy käyttämään yksinomaan Bosstuotteita ja osaa edelleen kertoa, mitä hänellä on päällään. Koodaa ohjelma siten, että Jasperiin ei tarvitse tehdä juuri muutoksia Adidas->Boss siirtymän takia, vaan ainoa muutos on tuoteperheen (tehtaan) vaihto. Bonus: Hyödynnä Java Reflection APIa tehtaan luonnissa. Muistele, mitä tehtiin Olio-ohjelmoinnin jatkokurssilla. 3. Composite: Suunnittele Composite-mallin mukaisesti rajapinnat ja toteutukset systeemille, jolla voit esittää pöytätietokoneen kokoonpanon ja laskea sen hinnan, kun kukin komponentti tietää oman hintansa. Idea on että tietokoneen kaikki osat ovat vaikkapa Laiteosa-rajapinnan toteuttajia. Laiteosalla on hinta. Laiteosia on erilaisia, esim: - muistipiiri - emolevy - prosessori - verkkokortti - näytönohjain

- kotelo Näistä ainakin emolevy ja kotelo ovat koostekomponentteja. Näiden hinta muodostuu komponentin omasta hinnasta sekä mahdollisen sisällön eli liitettyjen komponenttien hinnasta. Esitä luokkahierarkia ja rakenna pöytätietokonekokoonpano haluamistasi osista ja laske lopuksi kokoonpanon hinta ja tulosta se. Hinnan ilmoittava metodi palauttaa hinnan metodin paluuarvona. Bonus: Esitä, kuinka voit luoda kaikki tuoteosat abstraktin tehtaan avulla. Esitä myös, kuinka konkreettista tehdasta vaihtamalla saat helposti lasketuksi eri tehtaiden tuottamien samanlaisten kokoonpanojen hintoja. 4. Observer: Toteuta luentomateriaalissa (Observer.pdf) Observer-mallin sovelluksena esitetty digitaalinen kello Javalla täydentäen koodia puuttuvin osin. Käytä Javan APIsta löytyviä Observer-luokkaa ja Observablerajapintaa. 5. Singleton: Mieti jokin konkreettinen sovellustilanne, jossa Singletonmallista olisi hyötyä. Esitä sovelluksen toteutus Javalla. Ks. toteutusvihjeet wikipedasta. Voit esim. toteuttaa abstraktin tehtaan singletonina. Voit hyödyntää lisäksi reflektiota. 6. Decorator (valitse joko a, b tai c): a) Toteuta data-rakenne ja sen käsittely joko pääsynvalvonnalla tai ilman pääsynvalvontaa. Pääsynvalvonta dekoraattorilla. b) Toteuta datan kirjoirttaminen/lukeminen levylle/levyltä joko salakirjoitettuna tai ilman. Salakirjoitus ja purku dekoraattorilla. c) Pizzaravintola laatii pizzahinnaston decorator-mallin avulla. Pizza koostuu pohjasta ja erilaisista täytteistä. Pohjalla ja täytteillä on kullakin omat hinnat. Tee ohjelma, jossa rakennat kolme mieleistäsi pizzaa ja tulostat pizzamenun hintoineen. Pizzapohja ja kaikki täytteet toteuttavat Pizza-rajapintaa. Kaikki täytteet ovat dekoraattoreita. Piirrä myös luokkakaavio. 7. State: Määrittele pelihahmo ja sille kolme kehitysastetta. Toteuta eri kehitysasteet State-mallin mukaisesti. Pelihahmo voisi olla esim. Pokemon-hahmo Charmander, jonka kaksi muuta kehitysastetta ovat Charmeleon ja Charizard. Määrittele pelihahmolle vähintään kolme erilaista toimintoa (metodia) siten, että käyttäytyminen riippuu pelihahmon

tilasta. 8. Template Method: Alla oleva Template Method -malliin perustuva kehys (http://en.wikipedia.org/wiki/template_method_pattern) määrittelee yleisen pelin kulun. Toteuta siihen perustuen jokin yksinkertainen toimiva peli. /** * An abstract class that is common to several games in * which players play against the others, but only one is * playing at a given time. */ abstract class Game { protected int playerscount; abstract void initializegame(); abstract void makeplay(int player); abstract boolean endofgame(); abstract void printwinner(); /* A template method : */ public final void playonegame(int playerscount) { this.playerscount = playerscount; initializegame(); int j = 0; while (!endofgame()){ makeplay(j); j = (j + 1) % playerscount; printwinner(); Now we can extend this class in order to implement actual games: class Monopoly extends Game { /* Implementation of necessary concrete methods */ void initializegame() { void makeplay(int player) { boolean endofgame() { void printwinner() { /* Specific declarations for the Monopoly game. */

class Chess extends Game { /* Implementation of necessary concrete methods */ void initializegame() { void makeplay(int player) { boolean endofgame() { void printwinner() { /* Specific declarations for the chess game. */ 9. Strategy: tee a) tai b). a) Määrittele Strategy-mallin mukaisesti ListConverter-rajapinta, jossa määritellään listtostring-metodi, joka saa parametrikseen Listtietorakenteen ja palauttaa listan merkkijonona, jossa 1. strategia kirjoittaa rivinvaihtomerkin jokaisen alkion jälkeen 2. strategia tulostaa rivinvaihtomerkin joka toisen alkion jälkeen 3. strategia tulostaa rivinvaihtomerkin joka kolmannen alkion jälkeen Toteuta eri strategioissa listan läpikäynti eri tavoin. Eri tapoja: - iteraattorin käyttö - lista taulukoksi ennen läpikäyntiä, joka toteutetaan for-silmukassa - listan läpikäynti for-silmukassa käyttäen List-rajapinnan get-metodia. Testiohjelmassa luodaan lista ja tulostetaan eri strategioilla aikaansaatu lopputulos. b) Toteuta vähintään kolme erilaista taulukon lajittelualgoritmia (lähdekoodeja esim. http://www.cs.ubc.ca/~harrison/java/sortingdemo.html). Esitä sovellus, jossa lajittelualgoritmin valinta toteutetaan Strategy-mallin mukaisesti. Generoi tarpeeksi suuri lajiteltava aineisto ja mittaa lajitteluun kuluvat ajat.

10. Chain of Responsibility: Yrityksessä työntekijän lähiesimies pystyy hyväksymään 2 % palkankorotuspyynnöt. Pyyntö pitää ohjata yksikön päällikölle, jos se ylittää 2 % mutta on alle 5 %. Tätä suuremmat palkankorotuspyynnöt ohjataan yrityksen toimitusjohtajalle. Esitä, kuinka ratkaiset työntekijän palkankorotuspyynnön käsittelyn Chain of Responsibility mallilla. 11. Memento: Arvuuttajalla on useita asiakkaita (säikeitä), joita kutakin varten se arpoo luvun, jota asiakas yrittää arvata. Peli käynnistyy siten, että asiakas ilmoittautuu peliin mukaan Arvuuttajan liitypeliin()-metodilla (asiakas välittää itsensä parametrina), Metodissa arvuuttaja arpoo luvun ja tallentaa sen. Perinteinen tapa toteuttaa Arvuuttaja, on määritellä siihen Hashtable, jossa säilytetään asiakaskohtaiset tiedot (key = asiakas, value=luku). Arvatessaan lukua asiakas välittää arvaus()-kutsussa parametrina itsensä ja arvauksensa. Paluuarvona on true tai false. Mementoa käytettäessä Hashtable-ratkaisua ei tarvita eikä asiakkaan viitteen välittämistä arvuuttajalle. Arvuuttaja palauttaa liitypeliin()- metodissa asiakkaalle Mementon, jossa on arvottu luku, joten Arvuuttajan ei sitä tarvitse muistaa. Huomaa, että asiakas ei saa päästä lukuun käsiksi! Arvauksensa yhteydessä asiakas välittää Arvuuttajalle Mementon, jossa olevaa lukua Arvuuttaja vertaa uuteen arvaukseen ja kertoo kuinka kävi. Toteuta ohjelma Javalla. 12. Proxy: Laajenna Wikipediassa olevan Proxy-esimerkkiä http://en.wikipedia.org/wiki/proxy_pattern siten, että lisäät Imagerajapintaan showdata()-metodin, joka näyttää kuvan nimen. Lisää pääohjelmaan valokuvakansio (esim. List-rakenne), johon lisäät valokuvia proxyinä. Tulosta pääohjelmassa tiedot valokuvakansion sisällöstä (kuvia ei ladata). Esitä myös kuinka valokuvakansiota voidaan selata (kuvat ladataan, ellei vielä ole ladattu). 13. Visitor: tee a) tai b) a) Pohdi voitaisiinko Visitor-mallia käyttää State-mallin kontekstiolioiden käsittelyyn. Kontekstioliot olisivat eri pelihahmoja, jotka ovat eri tiloissa. Pelissä haluttaisiin käydä kaikki pelihahmot läpi esim. siten että jokaiselle hahmolle annetaan bonuspisteitä. Annettavien bonuspisteiden määrä voi riippua kuitenkin hahmosta ja sen tilasta. Bonus-visitorissa on metodi kunkin hahmon kutakin tilaa kohden. Esitä tällainen bonuspisteiden jakaminen Java-koodina. Toteutuksesta: Kontekstioliolle sanotaan accept(visitor), joka delegoi pyynnön tilaoliolleen.

b) Voitaisiinko päätös seuraavasta tilasta ulkoistaa Visitoriin. Tilaolio kutsuisi kunkin metodin lopuksi Visitoria (accept-kutsua ei tarvittaisi), joka tekee päätöksen mahdollisesta tilan vaihdosta. Esitä Java-koodina. 14. Builder: Kirjoita ohjelma, jossa rakennat kerroshampurilaisen Buildermallin mukaisesti. Toteuta vähintään kaksi konkreettista builderia (Hesburger ja McDonalds). 15. Adapter: Adapter-ratkaisu mahdollistaa olemassa olevan ohjelmamoduulin (esim. luokka) käyttämisen vaikka sen rajapinta olisi erilainen, kuin mitä asiakas haluaa käyttää. Mieti itse tätä havainnollistava esimerkki ja toteuta ohjelma, jossa esität, kuinka adapterin avulla olemassa oleva luokka palveluineen voidaan ottaa käyttöön muuttamatta tätä millään tavalla. 16. Bridge: Bridge-mallin idea on, että jokin yhdellä ohjelmistokerroksella toimiva abstraktio voidaan toteuttaa eri alustoilla ja että alusta voidaan vaikkapa vaihtaa kääntämättä asiakasohjelmaa. Valmistaudu kertomaan jokin esimerkki, jossa yhden kerroksen palvelu voidaan toteuttaa kahdella eri alustalla. 17. Flyweight: Lue Flyweight-mallia käsittelevä artikkeli: http://www.javaworld.com/javaworld/jw-07-2003/jw-0725- designpatterns.html. Testaa esimerkit 1 ja 2: String ja Border. Valmistaudu esittelemään, mitä testien perusteella voidaan todeta. 18. Prototype: Ohjelmoi kello+viisarit -esimerkki (kello koostuu viisariolioista) ja selvitä sen avulla, kuinka Javassa toteutetaan Prototype-mallia (Object.clone()). Esitä sellainen esimerkki, jossa toteutuu syväkopiointi. Eli: tee kellosta klooni ja katso kuinka se käyttäytyy suhteessa alkuperäiseen, jos muutat alkuperäisen tai kloonin kellonaikaa. 19. Mediator: Suunnittele mäkihyppykisan luokat ja niiden välinen toiminta. Luokkia: Hyppääjä, Hyppy (jokaisella hyppääjällä kaksi hyppyä), Mittamies, Arvostelutuomarit (5 kpl), Tulostaulu, Tulosrivi, Kisasihteeri (laskee hypyn jälkeen sille pisteet). Mediator on vastuussa edellä esitettyjen luokkien välisen kommunikointiprotokollan toteuttamisesta. Suunnittele se. Esitä ratkaisu sekvenssikaavion avulla. 20. Iterator: a) Tutki kuinka Javan iteraattori käyttäytyy, jos yritetään iteroida kokoelmaa kahdella säikeellä yhtä aikaa, kun molemmilla on oma iterattori. b) entä, jos säikeet käyttävät samaa iteraattoria vuorotellen? c) Kuinka käy, jos kokoelmaan tehdään muutoksia iteroinnin läpikäynnin aikana.

d) Keksi jotain muuta testattavaa. 21. Facade: Lue artikkeli http://www.allapplabs.com/java_design_patterns/facade_pattern.htm, ja testaa Fasadi-esimerkki. Raportoi oppimasi/havaintosi. 22. Command: Toteuta Wikipedian Command-esimerkkiä (http://en.wikipedia.org/wiki/command_pattern) mukaillen sovellus, jossa mallinnetaan kaksi seinäpainiketta: valkokangas ylös, valkokangas alas.