04.11.2014 Views

elektronická verzia publikácie - FIIT STU - Slovenská technická ...

elektronická verzia publikácie - FIIT STU - Slovenská technická ...

elektronická verzia publikácie - FIIT STU - Slovenská technická ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Návrhové vzory 21<br />

Problémy môže spôsobi aj nekonzistencia stavu entity pri odoslaní notifikácie o jeho<br />

zmene. Môže sa sta, že notifikácia sa odošle v ase, ke ešte nedošlo k úplnej zmene stavu,<br />

a nastane konflikt. Práve z tohto dôvodu býva metóda notifikujPozorovatele()<br />

niekedy zapuzdrená ako privátna metóda.<br />

Nástrahou použitia vzoru je aj výkonnos metódy aktualizuj(), do ktorej je sústredená<br />

celá logika reakcie na zmenu stavu predmetu pozorovania.<br />

1.4.5 Príklad<br />

Použitie vzoru demonštrujeme na príklade naítavania znakov z klávesnice a následného<br />

výpisu na výstup. Ide o jeden z najjednoduchších príkladov použitia vzoru v prostredí<br />

jazyka Java, ktorý bol prevzatý z Wikipedie 5 a mierne upravený .<br />

Trieda EventSource dedí od triedy Observable, ktorá zapuzdruje funkcionalitu<br />

predmetu pozorovania. Stav inštancie triedy EventSource sa zmení po zadaní znaku<br />

z klávesnice. Metódou notifyObservers() notifikujeme pozorovateov o tejto zmene.<br />

public class EventSource extends Observable implements Runnable {<br />

public void run() {<br />

try {<br />

final InputStreamReader isr =<br />

new InputStreamReader(System.in);<br />

final BufferedReader br = new BufferedReader(isr);<br />

}<br />

}<br />

while(true) {<br />

final String response = br.readLine();<br />

setChanged();<br />

notifyObservers(response);<br />

}<br />

} catch (IOException e) {<br />

e.printStackTrace();<br />

}<br />

Príklad 1-6. Zdrojový kód triedy EventSource.<br />

Metódou update() triedy ResponseHandler implementujeme už samotnú logiku<br />

zmeny súvisiacej so zmenou predmetu pozorovania. V našom príklade ide o výpis naítanej<br />

klávesy na výstup.<br />

public class ResponseHandler implements Observer {<br />

private String resp;<br />

}<br />

public void update (Observable obj, Object arg) {<br />

if (arg instanceof String) {<br />

resp = (String) arg;<br />

System.out.println("\nReceived: "+ resp );<br />

}<br />

}<br />

Príklad 1-7. Zdrojový kód triedy ResponseHandler.<br />

5<br />

http://en.wikipedia.org/wiki/Observer_pattern

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!