suunnittelumalleja, mvc - cs.tut.figrako/2008/luennot/suunnittelumalleja_2008.pdf · (java swing...

Post on 15-Jul-2019

213 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Suunnittelumalleja,MVC

Juha Järvensivujuha.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 tilamuuttuu, siitä riippuvat oliot saavat ilmoituksenja päivittyvät automaattisesti

Tarkkailijamalli (Observer)

UI

Data

UI

Data

View1

Data

View2 View3

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

Tarkkailija (Observer)

• Observeri rekisteröityy kuuntelemaanmallia

Tarkkailija (Observer)

• Kutsuminen

Tarkkailija (Observer)

• Rekisteröinnin peruminen

Tarkkailija (Observer)

• .NET– eventtien avulla

• Java– Rajapintojen avulla– Observer, Observable

.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);

}}

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();

}}

Strategia suunnittelumalli

Strategia-suunnittelumalli

• Määrittelee algoritmiperheen, kapseloikunkin algoritmin ja tekee niistäkeskenään vaihdettavia. Algoritmiavoidaan 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 vainnumeroita.

Strategia-suunnittelumalli

• Luokkarakenne

Context

+ ContextInterface()

ConcreteStrategyA

+ AlgorithmInterface()

ConcreteStrategyC

+ AlgorithmInterface()

ConcreteStrategyB

+ AlgorithmInterface()

Strategy

+ AlgorithmInterface()

strategy

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() methodprotected 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 rekursiivisestikoostettuna puurakenteena. Yksittäisiäolioita ja oliokoosteita voidaan käsitelläsamalla tavalla

Rekursiokooste (Composite)

• LuokkarakenneComponent

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

Composite

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

Leaf

+ Operation()

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;

}

M

V

C

MVC

MVC

• Model – View – Controller

MVC

MVC

MVC:n edut

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

Model

• Irroittaakäyttöliittymän jadatan

• HyödyntääTarkkailija-suunnittelumallia

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

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

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

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

top related