Suunnittelumalleja, MVC Juha Järvensivu juha.jarvensivu@tut.fi 2008
Sisältö Tarkkailija Strategia Rekursiokooste Tehdas-metodi MVC
Tarkkailija suunnittelumalli
Tarkkailijamalli (Observer) Määrittelee olioiden välille yksi moneen riippuvuuden siten, että kun yhden olion tila muuttuu, siitä riippuvat oliot saavat ilmoituksen ja päivittyvät automaattisesti
Tarkkailijamalli (Observer) UI UI View1 View2 View3 Data Data Data
Tarkkailija (Observer) LuokkaRakenne Subject + Attach() observers Observer + Detach() + Update() + Notify() for all o in observers { o->update() ConcreteSubject - subjectstate + GetState() + SetState() subject ConreteObserver - observerstate + Update() observerstate = subject->getstate() return subjectstate
Tarkkailija (Observer) Observeri rekisteröityy kuuntelemaan mallia
Kutsuminen Tarkkailija (Observer)
Tarkkailija (Observer) Rekisteröinnin peruminen
Tarkkailija (Observer).NET eventtien avulla Java Rajapintojen avulla Observer, Observable
.NET observer public class GUI { public void GUI(Subject s) { s.changed += new EventHandler(update); public void update(object source, EventArgs e) { MessageBox.Show(s.Data); public class Subject { private string data = ""; public event EventHandler Changed; public string Data { get { return data; set { data = value; // Informoidaan tarkkailijoita OnChanged(new EventArgs());
Java observer public class GUI implements Observer { public void GUI(Subject s) { s.addobserver(this); public void update(observable o, Object arg) { String data = s.getdata(); public class Subject extends Observable { private String data = ""; public String getdata() { return data; public void setdata(string d) { data = d; setchanged(); notifyobservers();
Strategia suunnittelumalli
Strategia-suunnittelumalli Määrittelee algoritmiperheen, kapseloi kunkin algoritmin ja tekee niistä keskenään vaihdettavia. Algoritmia voidaan muuttaa muuttamatta sovellusta, joka sitä käyttää
Strategia-suunnittelumalli Käyttö GUI-ohjelmoinnissa Käytetään mm. valintaikkunoiden yhteydessä varmistamaan, että käyttäjä syöttää oikeanmallista tietoa. Esim. vaaditaan, että numeerinen tekstikenttä hyväksyy vain numeroita.
Strategia-suunnittelumalli Luokkarakenne Context + ContextInterface() strategy Strategy + AlgorithmInterface() ConcreteStrategyA ConcreteStrategyB ConcreteStrategyC + AlgorithmInterface() + AlgorithmInterface() + AlgorithmInterface()
Esimerkki (Java Swing borders)
Esimerkki (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder method protected void paintborder(graphics g) { switch(getbordertype()) { case LINE_BORDER: paintlineborder(g); break; case ETCHED_BORDER: paintetchedborder(g); break; case TITLED_BORDER: painttitledborder(g); break;...
Esimerkki (Java Swing borders) JComponent setborder() JBorder paintborder()
Esimerkki (Java Swing borders) Example 2. The right way to paint Swing borders // The actual implementation of the JComponent.paintBorder() method protected void paintborder(graphics g) { Border border = getborder(); if (border!= null) { border.paintborder(this, g, 0, 0, getwidth(), getheight());
Esimerkki (Java Swing borders) Example 3. Setter and getter methods for a Swing component's border... private Border border;... public void setborder(border border) { Border oldborder = this.border; this.border = border; firepropertychange("border", oldborder, border); if (border!= oldborder) { if (border == null oldborder == null!(border.getborderinsets(this). equals(oldborder.getborderinsets(this)))) { revalidate(); repaint();... public Border getborder() { return border;
Rekursiokooste
Rekursiokooste (Composite) Malli esittää oliot rekursiivisesti koostettuna puurakenteena. Yksittäisiä olioita ja oliokoosteita voidaan käsitellä samalla tavalla
Rekursiokooste (Composite) Luokkarakenne Component + Operation() + AddGraphic() + Remove() + GetChild(in ind:int) Leaf + Operation() Composite + Operation() + Add() + Remove() + GetChild()
Rekursiokooste (Composite) Käyttö GUI-ohjelmoinnissa Grafiikkasovellukset Käyttöliittymäikkunoiden yhteydessä
Tehdas metodi
Tehdas metodi (factory method) UML class diagram
Tehdasmetodi Käyttö GUI-ohjelmoinnissa UI-komponenttien luonti Object* createlabel(string text) { Object* pobject = new Label(); if(pobject) { pobject->settext(text); pobject->setenabled(true); pobject->setvisible(true); return pobject;
MVC M C V
MVC Model View Controller
MVC
MVC
MVC:n edut 1. Selkeä rakenne 2. Laajennettavuus 3. Modulaarisuus 4. Tuki hajautukselle
Model Irroittaa käyttöliittymän ja datan Hyödyntää Tarkkailijasuunnittelumallia
View Esittää datan käyttäjälle Näkymät voivat olla sisäkkäisiä Voi hyödyntää toteutuksessaan Rekursiokooste (Composite) suunnittelumallia Esim painonapeista koostuva kontrollipaneeli
Controller Käsittelee käyttäjän syötteet Vaihtamalla kontrolleria on mahdollista ohjelman ajon aikana muuttaa tapaa, jolla ohjelma reagoi käyttäjän syötteeseen Esim. asetetaan kontrolleriksi tyhjä toteutus, jolloin näkymä ei reagoi käytäjän syötteisiin Voi hyödyntää Strategia-suunnittelumallia
Lähteitä Observer design pattern http://msdn.microsoft.com/library/default.asp?url=/libr ary/en-us/dnbda/html/observerpattern.asp http://en.wikipedia.org/wiki/observer_pattern Abstract factory http://www.exciton.cs.rice.edu/javaresources/design Patterns/FactoryPattern.htm http://en.wikipedia.org/wiki/abstract_factory_pattern http://www.csharpcorner.com/language/abstractfactorypatternsi ncsrvs.asp http://www.csharpcorner.com/code/2003/jan/abstractpattern.asp
Lähteitä Strategy design pattern http://www.exciton.cs.rice.edu/javaresources/design Patterns/StrategyPattern.htm http://www.javaworld.com/javaworld/jw-04-2002/jw- 0426-designpatterns.html MVC http://ootips.org/mvc-pattern.html http://st-www.cs.uiuc.edu/users/smarch/stdocs/mvc.html http://en.wikipedia.org/wiki/model_view_controller