ohjelmistoarkkitehtuurit kevät 2016 komponenttien...
TRANSCRIPT
Ohjelmistoarkkitehtuurit
Kevät 2016
Komponenttien vuorovaikutus &
suunnittelumallit
Samuel Lahtinen
http://www.cs.tut.fi/~ohar/
1.2.2016 1Ohjelmistoarkkitehtuurit 2016
4. Komponenttien
vuorovaikutus
2
• Roolirajapinnat
• Välittäjät
• Fasaadit
• Kutsun siirtäminen
• Edustajat
• Takaisinkutsut
• Tapahtumat
• Viestit
• Sovittimet
• Tehtaat
1.2.2016Ohjelmistoarkkitehtuurit 2016
Suunnittelumalleista yleisesti
31.2.2016Ohjelmistoarkkitehtuurit 2016
Toteutusriippuvuuksien
poistaminen rajapinnoilla
4
A B
A B
IB
A ei tunne
mitä
miten
1.2.2016Ohjelmistoarkkitehtuurit 2016
Rooliperustaiset rajapinnat
5
Client1
Server
Services
Client2
Client1
Server
Role1
Client2 Role2
Client1 käyttää Server:iä
eri roolissa ja siksi eri palveluja
kuin Client2
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki
6
Button
VisualComponent
EventSource
1.2.2016Ohjelmistoarkkitehtuurit 2016
Vs. Qt
Qobject (eventit)-Qwidget-QabstractButton-QPushButton
1.2.2016Ohjelmistoarkkitehtuurit 2016 7
Hienojakoiset roolirajapinnat
8
Asiakkaat Palvelun
tarjoajatRoolit
A
B
C
D
P
Q
X
Y
Z
P:n ”perinteinen” rajapinta
Q:n ”perinteinen” rajapinta
1.2.2016Ohjelmistoarkkitehtuurit 2016
Komponenttien
vuorovaikutuksen hallinta
9
Joukko keskenään kommunikoivia
komponentteja
1.2.2016Ohjelmistoarkkitehtuurit 2016
Komponenttien
vuorovaikutuksen hallinta
10
Ongelmia:• komponenttien väliset riippuvuudet mutkikkaita
ja vaikeita hallita
• jos jokin yhteistoiminta halutaan muuttaa,
joudutaan jokaista osallistujaa muuttamaan
• komponentteja ei voi käyttää helposti toisessa
yhteydessä
• Ohjelman toiminnallisuuden seuranta vaikeutuu
• Komponenttikaavion suhteet muistuttavat black
metal -bändin logoa/levynkantta (mikä bändi?)
• Dynaamiset kirjastot ja komponentit, vaikea
hallita jne.
1.2.2016Ohjelmistoarkkitehtuurit 2016
(ja tärkeänä vastauksena kysymykseen: kuvassa vähän siistitty versio laulu- ja soitantayhtye Venomin esikoislevyn kannesta,
Jokunen vuosi myöhemmin myös Pentagram niminen solistiyhtye koristeli Relentless-levynsä kanta lähes identtisellä taiteella.
Toki vastaavaa kuvitusta löytyy lähes jokatoiselta black metal-yhtyeeltä…)
Esimerkki komponenteista
11
ListBox
TextField Button
1.2.2016Ohjelmistoarkkitehtuurit 2016
File dialog Tooltip
Esimerkki
12
Ilmanlaadun
hallinta
Ikkunoiden
hallinta
Ilmastoinnin
hallinta
avaa
ikkuna
sulje
ilmastointi
1.2.2016Ohjelmistoarkkitehtuurit 2016
Riippuvuuksien keskittäminen:
Mediator
13
Etuja:
• vuorovaikutus omana
kokonaisuutena (välittäjä),
voidaan muuttaa tai räätälöidä
koskematta komponentteihin
• tekee komponentit riippumat-
tomiksi toisistaan
• yksinkertaistaa kommunikaatiota
(yksi-moneen, ei moni-moneen)
Ongelma: keskitetty kontrolli voi
kasvaa itsessään monimutkaiseksi
Keskitetään vuorovaikutuksen
kontrolli rajoittamalla komponenttien
vastuut ja ottamalla käyttöön uusi
komponentti, jonka vastuulla on
vuorovaikutuksen hallinta
1.2.2016Ohjelmistoarkkitehtuurit 2016
1.2.2016Ohjelmistoarkkitehtuurit 2016 14
http://www.codeproject.com/Articles/186187/Mediator-Design-Pattern
Esimerkki
15
Dialog
Coordinator
ListBox
CoordinatorwidgetChange(Widget)
Widgetchanged()
TextField
Button
ButtonIenable()
TextFieldIsetText(str)
ListBoxIgetSelected(): str
Välittäjä
1.2.2016Ohjelmistoarkkitehtuurit 2016
Tyypillinen vuorovaikutus
16
:ListBox :DialogCoordinator :TextField :Button
widgetChange
getSelected
setText
enable
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki
17
Ilmanlaadun
hallinta
Ikkunoiden
hallinta
Ilmastoinnin
hallinta
avaa
ikkunasulje
ilmastointi
1.2.2016Ohjelmistoarkkitehtuurit 2016
Kysyttävää?
181.2.2016Ohjelmistoarkkitehtuurit 2016
Kutsun siirtäminen (delegointi)
19
op B
op()
op B
op()
Bimp
imp
…
imp.opimp();
…
opimp()
palvelun
varsinainen
suorittajaB saa palvelupyynnön:
Voi olla erilaisia syitä:
- halutaan tehdä oheistoimintaa, joka ei näy palvelun pyytäjälle
- halutaan pystyä helposti vaihtamaan toteutus dynaamisesti
- halutaan muuttaa kutsumuotoa
- halutaan piilottaa varsinainen suorittaja
Yleinen perusmekanismi
monessa standardiratkaisussa
1.2.2016Ohjelmistoarkkitehtuurit 2016
Kutsun siirtäminen: esimerkki
20
Account
ManagerCustomer
Chargablediscount(int): int
CustomerSupportdiscount(int): int
KeyCustomer
Support
1.2.2016Ohjelmistoarkkitehtuurit 2016
Delegate esim. C#
1.2.2016Ohjelmistoarkkitehtuurit 2016 21
delegate osana kieltä, funktio-osoitin, delgaatti ja tapahtumien sitominen siihen jne.
http://www.csharp-station.com/Tutorial/CSharp/Lesson14
public class WorkerClass{
public delegate void LogHandler(string message);
public void process(LogHandler logHandler){
if (logHandler != null){
logHandler("Process() begin");}if (logHandler != null){
logHandler("Process() end");}
}}
public class TestApplication{
static void logger(string s){
Console.WriteLine(s);}
static void Main(string[] args){
WorkerClass myClass = new WorkerClass();WorkerClass.LogHandler myLogger = new WorkerClass.LogHandler(logger);myClass.process(myLogger);
}}
Mikä suunnittelumalli?
1.2.2016Ohjelmistoarkkitehtuurit 2016 22
Riippuvuuksien kuristaminen:
Fasadi (Facade)
23
alijärjestelmäalijärjestelmä
Fasaadi
1.2.2016Ohjelmistoarkkitehtuurit 2016
Fasadia
24
Luentojen aloittaminen (laitteisiin liittyvät asiat):
• Tarkasta puhelin, aseta äänettömälle jos äänellinen
• Räplää luentosalihallintaa, valitse valaistus ja kuvalähde ja käynnistä
tykkeilymoodi
• Kirjaudu luentosalin koneeseen
• Läppäri auki, kirjaudu sisään
• Avaa selain
• Kytke kamera, kytke mikkihärveli
• Pistä mikkihärveli pois äänettömästä tilasta
• Avaa Adobe Connect, kirjaudu sisään
• (Käynnistä uudelleen, kun Flash kaatuu)
• Käynnistä Connect myös luentosalikoneella
• Avaa molempiin koneisiin Slack, kirjaudu sisään, valitse luennot-kanava
• Kirjaudu google formsiin (etusivu, sposti, salasana…) *2
• Takaisin läppärille (kytke vga-piuha) & valitse extend to second screen
• Avaa Powerpoint ja käynnistä esitystila
• valitse Connectin kuvalähteeksi kakkosnäyttö, käynnistä esitys
• Varmista että kuva näkyy luentosalin koneella
• Valitse kamera, aktivoi se
• Valitse mikrofoni, aktivoi
• Aloita tallennus
• Aloita luento
…1.2.2016Ohjelmistoarkkitehtuurit 2016
Fasadin kanssa:
Aloita luento
Keskeytä luento
Jatka luentoa
Lopeta luento
tallennustenHallinta
pääsy
Echo/connect-
rajapintaan
Fasadi suunnittelumalli
25
• Käytetään antamaan yksinkertainen, useimmille käyttäjille
riittävä oletusliittymä monimutkaiseen alijärjestelmään,
tekemään korkeamman tason palveluita, joilla voi yhdistää
useampia toimintoja
• Fasadi ei kuitenkaan täysin piilota alijärjestelmän komponentteja
suoralta käytöltä
• Voidaan käyttää esimerkiksi kerrosarkkitehtuurissa antamaan
kullekin kerrokselle yksinkertainen sisääntulokohta (ja rajapinta)
• Vrt. Välittäjä: yksisuuntainen palvelu, tyypillisesti fasadi vain
hoitaa palvelukutsut oikealle komponentille/oikeille
komponenteille
• Fasadin käyttöä voidaan edelleen kaventaa roolirajapinnoilla (eri
fasadi eri käyttäjille)
• Fasadin perusideaa käytössä esim. MVC ja rajapinnat: esim.
kontrolleri hoitaa mallin kanssa kommunikoinnin, voi kutsua
usean eri osan palveluita
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki
26
StudentFacade
registerStudent
removeStudent
getStudentInfo
StudyRegister
StudentRegister
PaymentSystemregStudentToCourse
removeStudentFromCourse
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki: Sports tracker -
kopio
• Käyttäjälle ja käyttöliittymän suuntaan haluttuja toimintoja,
aloita, lopeta, pysäytä, treeniyhteenvedot
• Erilaisia alijärjestelmiä:
– Sijaintitieto, ajanotto/ajastus, datayhteydet, treenitiedot, autentikointi …
– Fasadirajapintaan toimintojen mukaiset palvelut, jotka hoitavat esim.
Aloita-osassa GPS:n päälle, karttapalvelun käynnistämisen, ajastuksen
aloittamisen, jne.
– Lopeta, pysäyttää ajastuksen, kerää tiedot karttaosiolta, pyrkii
käynnistämään datayhteyden, hoitaa autentinkoinnin ja lisää
treenitiedot palvelimelle
1.2.2016Ohjelmistoarkkitehtuurit 2016 27
Periytymisen toteutus kutsun
siirtämisellä
29
Car
Vehicle
parent
Commodity
printDescription-kutsu
printDescription:
{printName;
... }
”täydellinen" Car olio
self
parent
parent
1.2.2016Ohjelmistoarkkitehtuurit 2016
https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
http://www.sitepoint.com/simple-inheritance-javascript/
https://medium.com/javascript-scene/common-misconceptions-about-inheritance-in-javascript-d5d9bab29b0a#.cnacombkk
Periytymisen toteutus kutsun
siirtämisellä
30
”Täydellinen" Car olio
Car
Vehicle
parent
CommodityprintDescription-kutsu
printDescription:
{printName;
... }
self
parent
parent
Product
parent
1.2.2016Ohjelmistoarkkitehtuurit 2016
Komponenttiriippuvuuksien
poistaminen edustajalla
(proxy)
31
Edustaja: komponentti, joka edustaa toista komponenttia jossain
yhteydessä ilman, että komponentin asiakkaat tietävät tätä. Tyypillisesti
edustaja tekee palvelupyynnön yhteydessä jotain oheistoimintaa.
EdustajaAsiakasop op Palvelun
tarjoaja
1.2.2016Ohjelmistoarkkitehtuurit 2016
Sovelluksia
32
Kun halutaan estää asiakkaan suora pääsy resurssiin
•hajautetut järjestelmät
• viivästetty lataaminen (esim. oliokannat), ositettu lataaminen
• älykkäät osoittimet
•Turvallisuus, asiakkaiden varmentaminen
•Älykkäät edustajat (smart proxy), palvelun suorittajan älykäs
valinta
• ...
1.2.2016Ohjelmistoarkkitehtuurit 2016
Edustaja (Proxy)
suunnittelumalli
33
Client
Proxy
Servicesrequest()
Server
request()
...
actual.request()
actual
1.2.2016Ohjelmistoarkkitehtuurit 2016
1.2.2016Ohjelmistoarkkitehtuurit 2016 34
Esimerkki: viivästetty lataaminen
35
if not loaded then
map = loadFromFile();
loaded = true
end;
map->getRoute()
varsinainen
getRoute
palveluNavigator
MapProxy
MapgetName()
getRoute(from,to)
getName
getRoute
CityMap
getName
getRoute
return mapName;
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki: viivästetty lataaminen
36
varsinainen
kuvaViewer
Proxy
PicturegetPic()
applyEffect()
ready()
+getPic()
+applyEffect()
+ready()
SmallPic
+getPic()
+applyEffect()
1.2.2016Ohjelmistoarkkitehtuurit 2016
FinalPic
+getPic()
+applyEffect()
Erilaisia edustajia,
käyttötarkoituksia
37
• Virtual proxy: viivästetty lataaminen, jne. Toimii
välissä ja varmistaa, ettei raskaita operaatiota
käynnistellä turhaan
• Protection proxy: käyttäjä ei pääse käyttämään
suoraan palvelua tai resurssia, proxy välissä sisältää
esimerkiksi autentikointia
• Remote proxy: verkkoresurssien käyttö rajapinnan
kautta, proxy hoitaa yhteysjutut (esim. ohjaa kutsut
oikeaan paikkaan, tuo lisäturvallisuutta jne.)
(vertaa proxy palvelimet)
1.2.2016Ohjelmistoarkkitehtuurit 2016
Proxy vs. Mediator vs. Broker
• Proxy kätkee palvelun sen käyttäjältä (syitä…)
• Mediator, toimii keskitettynä yhteyksien hallitsijana
• Broker, kuten yllä, mutta käsitteellinen ero, resurssit
hajautettuja, voivat vaihdella paikkaa jne.
– Broker tietää mistä palvelut löytyvät
– Voi joko suorittaa palvelut ja palauttaa tuloksen asiakkaalle tai toimia
kirjastona, anna tähän liittyvä palvelu..
• Broker ja proxyt, adapterit jne. yhteistoimminnassa
• Useampia brokereita, voivat tuntea toisensa
1.2.2016Ohjelmistoarkkitehtuurit 2016 38
Broker
1.2.2016Ohjelmistoarkkitehtuurit 2016 39
Broker
1.2.2016Ohjelmistoarkkitehtuurit 2016 40
1.2.2016Ohjelmistoarkkitehtuurit 2016 41
1.2.2016Ohjelmistoarkkitehtuurit 2016 42
https://msdn.microsoft.com/en-us/library/ff648096.aspx
Kysyttävää?
431.2.2016Ohjelmistoarkkitehtuurit 2016
Riippuvuuksien poistaminen
takaisinkutsuilla
44
Takaisinkutsu
Palvelun tarjoajalta sen pyytäjälle kesken palvelun tuleva kutsu.
Tekniikka, jonka avulla palvelun pyytäjä voi saada kontrollin
kesken palvelun suorituksen.
Tavallisesti palvelu kuuluu johonkin yleiskäyttöiseen kirjastoon,
joka ei saa tulla riippuvaksi kirjastoa käyttävistä sovelluksista.
Takaisinkutsu mahdollistaa sovelluskohtaisen räätälöinnin
yleiskäyttöisille palveluille ilman, että ne tulevat riippuviksi
sovelluksista.
1.2.2016Ohjelmistoarkkitehtuurit 2016
Takaisinkutsu (Callback)
45
palvelun
kutsu
takaisinkutsu
kirjasto
sovellus
paluu
: Kirjasto : Sovellus
palvelun kutsu
takaisinkutsu
paluu
palvelun paluu
takaisin-
kutsu
sekvenssikaaviona:
1.2.2016Ohjelmistoarkkitehtuurit 2016
Takaisinkutsurajapinta
46
Engine
Car
EngineUserwarn(str)
setup()
warn(str)
...
PowerSourcestart()
stop()
setUser(EngineUser)
log.output("Oil pressure low");
myeng.stop();
run()
…
if (oilpressure<limit) {
user.warn();
...
myeng = new Engine();
myeng.setUser(this);
myeng.start();
Yleiskäyttöinen
Sovelluskohtainen
Takaisinkutsurajapinta
1.2.2016Ohjelmistoarkkitehtuurit 2016
HUOM! Oikeassa ajoneuvonohjausjärjestelmässä
moottorinohjaus jne. ovat omina erillisinä itsenäisinä fyysisinä ohjainyksikköinä (viestintä viesteillä väylän avulla)
Käytetään poikkeuksia?
47
Voidaanko poikkeuksilla saada periaatteessa aikaan
sama kuin takaisinkutsuilla?
A Ei koskaan
B Joskus
C Aina
1.2.2016Ohjelmistoarkkitehtuurit 2016
Poikkeuksilla
48
Engine
Car
setup()
warn(str)
...
PowerSourcestart() throws Oilpressure
stop()
setUser(EngineUser)
screen.output(str+": Oil pressure low");
myeng.stop();
start()…
if (oilpressure<limit) {
...
throw new Oilpressure();
}
...
setup(): ...
myeng = new Engine();
myeng.setUser(this);
try {
myeng.start();
} catch (Oilpressure op) {warn("...");}
Yleiskäyttöinen
Sovelluskohtainen
Erot: - ei takaisinkutsurajapintaa
- käyttävän yksikön (Car) tulee varautua
poikkeukseen
Edut: - yksinkertaisempi
- kirjastoyksikön ei tarvitse tietää mitään
käyttävän yksikön operaatioista (edes takaisin-
kutsurajapintaa)
Haitat: - kirjastoyksikkö ei voi jatkaa
tapahtuman käsittelyn jälkeen (tässä tosin
ei ilmeisesti tarvitsekaan)
1.2.2016Ohjelmistoarkkitehtuurit 2016
Kysyttävää?
491.2.2016Ohjelmistoarkkitehtuurit 2016
Riippuvuuksien vähentäminen
tapahtumien avulla
50
Tapahtuma on ohjelman ajoaikainen tietoalkio,
• jonka synnyttää jokin komponentti,
• jonka syntymiseen reagoi yksi tai useampi komponentti ja
• joka häviää sen jälkeen kun ei ole olemassa enää komponenttia,
jonka tulisi reagoida sen syntymiseen.
• Tapahtuman synnyttäjä ei tunne tapahtuman syntymään
reagoivia yksiköitä
• Tapahtumat poistavat näkyvän riippuvuuden, mutta eivät väärin käytettynä
muuta ohjelman toiminnallista riippuvuusrakenneta (toiminnan
ymmärtäminen ja muuttaminen voi olla vielä vaikeampaa)1.2.2016Ohjelmistoarkkitehtuurit 2016
Perinteinen kutsu vs. tapahtuma
51
Palvelun
kutsuja
Palvelun
tarjoaja
Tapahtuma
Tapahtumaan
reagoivat
Tapahtuman
synnyttäjä
1.2.2016Ohjelmistoarkkitehtuurit 2016
Tapahtumat käyttöliittymissä
52
GUI
Sovelluslogiikka
Käyttäjän komennot Tilamuutokset
1.2.2016Ohjelmistoarkkitehtuurit 2016
Synkroninen takaisinkutsuihin
perustuva tapahtumankäsittely
53
Tapahtuman
aiheuttaja
rekisteröinti
ilmoitus tapahtumasta
(takaisinkutsu)
Reagoivat
yksiköt
Synkroninen =
tapahtuman aiheuttaja
odottaa tapahtuman käsittelyä
ennen kuin jatkaa.
1.2.2016Ohjelmistoarkkitehtuurit 2016
Asynkroninen tapahtumien
käsittely
54
• Mitä vaatimuksia verrattuna synkroniseen?
1.2.2016Ohjelmistoarkkitehtuurit 2016
Tarkkailija (Observer)
suunnittelumalli
55
SourceComp ObserverComp
Observerupdate(Event)
Sourceregister(Observer)
unregister(Observer)
obs src
1.2.2016Ohjelmistoarkkitehtuurit 2016
Tapahtumien käsittely Javassa:
Esimerkki
56
JMenuItem AppComp
ActionListeneractionPerformed(ActionEvent)
AbstractButtonaddActionListener(ActionListener)
obs src
1.2.2016Ohjelmistoarkkitehtuurit 2016
Tapahtumaesimerkki Qt:ssa
1.2.2016Ohjelmistoarkkitehtuurit 2016 57
QTimer *timer = new QTimer( this );
// takaisinkutsutyylillätimer->singleShot( timertime_.getTimeInMilliseconds(), this, SLOT( alarm() ) );
// yleisemmin tapahtumien yhdistelemisen avullaconnect( timer, SIGNAL( timeout() ), this, SLOT( alarm() ) );QObject::connect( QTimer, &QTimer::timeout, this, &MainWindow::alarm );
Mitä eroa näillä kahdella on? (jos esimerkiksi ajastus asetetaan uudestaan?)
Viestipohjainen kommunikointi
58
Komponentti 1 Komponentti 2
receive(Message m)
• Komponentit toteuttavat geneerisen viestin vastaanottorajapinnan (ja käyttävät sitä
suoraan tai viestinvälittäjän kautta)
• Komponentit kommunikoivat keskenään viestejä lähettämällä
• Viestien välittämisestä huolehtii usein erityinen komponentti (message dispatcher)
Viesti
1.2.2016Ohjelmistoarkkitehtuurit 2016
Rajapinnat vs. viestit
59
Palvelun
pyytäjä
Rajapinta
Viesti
Palvelun
tarjoaja
toteuttaa
Palvelun
tarjoaja
lukee ja
toteuttaa
Rajapinta kertoo mitä tehdään ja millä tiedolla, viesti voi kertoa mitä tahansa (mitä tehdään,
kuka tekee, millä tiedolla).
Viestinvälitysarkkitehtuurit,
palveluväylät (ESB),
Smalltalk
Komponentit,
Asiakas-palvelin,
Web palvelut (SOA),
C++, Java
func A(X…)
ACTION = A
PAR1 = X
Viestin
välittäjä
1.2.2016Ohjelmistoarkkitehtuurit 2016
Rajapintariippuvuuksien
poistaminen sovittimilla
60
Sovitin
Komponentti 1 Komponentti 2
Rajapinnan A mukainen
palvelupyyntö
Sovitin: palvelun pyytäjän ja tarjoajan välillä oleva ohjelmayksikkö,
joka tekee palvelun pyytäjän riippumattomaksi palvelun tarjoajan
rajapinnasta.
Rajapinnan B mukainen
palvelupyyntö
1.2.2016Ohjelmistoarkkitehtuurit 2016
Sovitin (Adapter) suunnittelumalli
61
Client
Adapter
AbstractServices
request()
Server
ConcreteServices
concRequest()
adaptee
request()...
adaptee.concRequest()
1.2.2016Ohjelmistoarkkitehtuurit 2016
Sovitin ja tapahtumat
62
Komponentti A Komponentti BSovitin
rekisteröinti
ilmoita
tapahtumasta
palvelu-
kutsu
1.2.2016Ohjelmistoarkkitehtuurit 2016
Sovittimien käyttö riippumattomien komponenttien tapahtumapohjaisessa kommunikoinnissa
Kysyttävää?
631.2.2016Ohjelmistoarkkitehtuurit 2016
Luontiriippuvuuksien
vähentäminen tehtaalla
Ongelma:
Miten ohjelmistoalusta tai yleiskäyttöiset komponentit
voivat luoda sovelluskohtaisia olioita/komponentti-
ilmentymiä tulematta riippuvaisiksi sovelluskohtaisista
luokista/komponenteista?
1.2.2016 64Ohjelmistoarkkitehtuurit 2016
Luontiriippuvuuksien
vähentäminen tehtaalla
65
Platform
AppFactory
Factorycreate(): Product
Productservice
AppProduct
<<create>>
AppInit
FactoryRegistryregister(Factory)
<<create>>
(alustus)
(käyttö)
1.2.2016Ohjelmistoarkkitehtuurit 2016
Yksinkertainen tehdas:
Tehdasmetodi (Factory Method)
suunnittelumalli
66
factoryMethod
anOperation
…
product = factoryMethod();
...
factoryMethod return new AppProduct();
Creator
ConcCreator
AppProduct
create
Product
1.2.2016Ohjelmistoarkkitehtuurit 2016
Esimerkki
67
createDocument()
newDocument()
openDocument()
doc = createDocument();
docs.add(doc);
doc.open();
createDocument() return new MyDocument;
DocManager
MyDocManager
create
use
Documentopen()
close()
MyDocument
open()
close()
1.2.2016Ohjelmistoarkkitehtuurit 2016
Ongelma: Miten varmistaa
yhdenmukaiset oliot?
68
Alusta
TAIMUTTA EI:
1.2.2016Ohjelmistoarkkitehtuurit 2016
Ratkaisu: yksi tehdasolio luo kaikki oliot
yhdenmukaisesti
69
Alusta
tehdasolio
luo
TwoDimFac
ThreeDimFac
ilmentymä
ilmentymä
tehdasluokka
factory class
käyttää
ShapeFac
1.2.2016Ohjelmistoarkkitehtuurit 2016
Abstrakti tehdas
suunnittelumalli
70
ProductA2
operA
ProductB2
operB
Alusta
Factory1
AbsFactorycreateProductA(): ProductA
createProductB(): ProductB
ProductA1
<<create>>
ProductB1
ProductA ProductB
operA operB
operA operB
Factory2
<<create>>
1.2.2016Ohjelmistoarkkitehtuurit 2016
Abstrakti tehdas (Abstract
Factory) suunnittelumalli:
Esimerkki
71
Sovellus-
alustaWinFactoryAbsFactory
createButton(): Button
createMenu(): Menu
WinButton
<<create>>
WinMenu
Button Menu
1.2.2016Ohjelmistoarkkitehtuurit 2016
Yhteenvetoa
72
• Roolirajapinnoilla täsmällisemmin tyypitetty arkkitehtuuri
• Välittäjän käyttö keskitettyyn vuorovaikutukseen
• Kutsun siirtäminen perusmekanismi monessa ratkaisussa
• Fasadi keskittää alijärjestelmän käytön
• Edustajalla voidaan liittää palveluun oheistoimintaa
• Takaisinkutsulla kontrolli palautetaan väliaikaisesti kutsujalle
• Tarkkailija yleinen ratkaisu tapahtumapohjaiseen vuorovaikutukseen
• Viestipohjainen kommunikointi löyhentää sidoksia
• Sovittimilla voidaan muuntaa rajapintoja
• Tehtailla voidaan luoda ilmentymiä, vaikka niiden tyyppiä ei tunneta
1.2.2016Ohjelmistoarkkitehtuurit 2016
Linkkejä ja luettavaa
• Iso kasa patterneja (Javalle): http://www.java-forums.org/ocmjea/57996-
tutorial-review-java-design-patterns-java-architect-exam.html
• Broker-mallista: Pattern-oriented Software architecture for dummies (luku
12)
• Mediator- ja viestinvälitysesimerkki Java Message Service
http://docs.oracle.com/javaee/6/tutorial/doc/bncdr.html
• Mediator, yksinkertainen esimerkkikoodi:
http://www.journaldev.com/1730/mediator-design-pattern-in-java-example-
tutorial
• Proxy pattern: http://www.oodesign.com/proxy-pattern.html
1.2.2016Ohjelmistoarkkitehtuurit 2016 73
Kysyttävää?
741.2.2016Ohjelmistoarkkitehtuurit 2016