38
Suunnittelumalleja, MVC Juha Järvensivu [email protected] 2008

Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

  • Upload
    buidien

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Suunnittelumalleja,MVC

Juha Jä[email protected]

2008

Page 2: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Sisältö

• Tarkkailija• Strategia• Rekursiokooste• Tehdas-metodi• MVC

Page 3: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija suunnittelumalli

Page 4: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailijamalli (Observer)• Määrittelee olioiden välille yksi moneen

riippuvuuden siten, että kun yhden olion tilamuuttuu, siitä riippuvat oliot saavat ilmoituksenja päivittyvät automaattisesti

Page 5: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailijamalli (Observer)

UI

Data

UI

Data

View1

Data

View2 View3

Page 6: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija (Observer)

• LuokkaRakenne

Subject

+ Attach()+ Detach()+ Notify()

ConcreteSubject- subjectState+ GetState()+ SetState()

Observer

+ Update()

ConreteObserver- observerState+ Update()

observerState =subject->GetState()

for all o in observers { o->update()

}

return subjectState

subject

observers

Page 7: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija (Observer)

• Observeri rekisteröityy kuuntelemaanmallia

Page 8: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija (Observer)

• Kutsuminen

Page 9: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija (Observer)

• Rekisteröinnin peruminen

Page 10: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tarkkailija (Observer)

• .NET– eventtien avulla

• Java– Rajapintojen avulla– Observer, Observable

Page 11: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

.NET observer

public class Subject{

private string data = "";public event EventHandler Changed;

public string Data{

get { return data; }set {

data = value;// Informoidaan tarkkailijoitaOnChanged(new EventArgs());

}}

}

public class GUI{

public void GUI(Subject s){

s.Changed += newEventHandler(update);

}

public void update(object source,EventArgs e)

{MessageBox.Show(s.Data);

}}

Page 12: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Java observer

public class Subject extends Observable{

private String data = "";

public String getData(){

return data;}public void setData(String d){

data = d;setChanged();notifyObservers();

}}

public class GUI implements Observer{

public void GUI(Subject s){

s.addObserver(this);}

public void update(Observable o,Object arg)

{String data = s.getData();

}}

Page 13: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Strategia suunnittelumalli

Page 14: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Strategia-suunnittelumalli

• Määrittelee algoritmiperheen, kapseloikunkin algoritmin ja tekee niistäkeskenään vaihdettavia. Algoritmiavoidaan muuttaa muuttamatta sovellusta,joka sitä käyttää

Page 15: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

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 vainnumeroita.

Page 16: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Strategia-suunnittelumalli

• Luokkarakenne

Context

+ ContextInterface()

ConcreteStrategyA

+ AlgorithmInterface()

ConcreteStrategyC

+ AlgorithmInterface()

ConcreteStrategyB

+ AlgorithmInterface()

Strategy

+ AlgorithmInterface()

strategy

Page 17: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Esimerkki(Java Swing borders)

Page 18: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

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;

...}

}

Page 19: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Esimerkki(Java Swing borders)

JComponent

setBorder()

JBorder

paintBorder()

Page 20: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Esimerkki(Java Swing borders)

Example 2. The right way to paint Swing borders

// The actual implementation of the JComponent.paintBorder() methodprotected void paintBorder(Graphics g) {

Border border = getBorder();

if (border != null) {border.paintBorder(this, g, 0, 0, getWidth(), getHeight());

}}

Page 21: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

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;}

Page 22: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Rekursiokooste

Page 23: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Rekursiokooste (Composite)

• Malli esittää oliot rekursiivisestikoostettuna puurakenteena. Yksittäisiäolioita ja oliokoosteita voidaan käsitelläsamalla tavalla

Page 24: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Rekursiokooste (Composite)

• LuokkarakenneComponent

+ Operation()+ AddGraphic()+ Remove()+ GetChild(in ind:int)

Composite

+ Operation()+ Add()+ Remove()+ GetChild()

Leaf

+ Operation()

Page 25: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Rekursiokooste (Composite)

• Käyttö GUI-ohjelmoinnissa– Grafiikkasovellukset– Käyttöliittymäikkunoiden yhteydessä

Page 26: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tehdas metodi

Page 27: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Tehdas metodi (factory method)

UML class diagram

Page 28: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

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;

}

Page 29: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

M

V

C

MVC

Page 30: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

MVC

• Model – View – Controller

Page 31: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

MVC

Page 32: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

MVC

Page 33: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

MVC:n edut

1. Selkeä rakenne2. Laajennettavuus3. Modulaarisuus4. Tuki hajautukselle

Page 34: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Model

• Irroittaakäyttöliittymän jadatan

• HyödyntääTarkkailija-suunnittelumallia

Page 35: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

View

• Esittää datan käyttäjälle• Näkymät voivat olla sisäkkäisiä

– Voi hyödyntää toteutuksessaanRekursiokooste (Composite) suunnittelumallia

– Esim painonapeista koostuva kontrollipaneeli

Page 36: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Controller

• Käsittelee käyttäjän syötteet• Vaihtamalla kontrolleria on mahdollista

ohjelman ajon aikana muuttaa tapaa, jollaohjelma 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

Page 37: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

Lähteitä• Observer design pattern

– http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/observerpattern.asp

– http://en.wikipedia.org/wiki/Observer_pattern• Abstract factory

– http://www.exciton.cs.rice.edu/JavaResources/DesignPatterns/FactoryPattern.htm

– http://en.wikipedia.org/wiki/Abstract_factory_pattern– http://www.c-

sharpcorner.com/Language/AbstractFactoryPatternsinCSRVS.asp

– http://www.c-sharpcorner.com/Code/2003/Jan/AbstractPattern.asp

Page 38: Suunnittelumalleja, MVC - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (Java Swing borders) Example 1. The wrong way to paint Swing borders // A hypothetical JComponent.paintBorder

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/st-

docs/mvc.html– http://en.wikipedia.org/wiki/Model_view_controller