Kurz 4 IT 115 od ZS 2015 4. cvičení Návrhový vzor Observer Adventura Alena Buchalcevová katedra informačních technologií Vysoká škola ekonomická v Praze buchalc@vse. cz
Přidání panelu východů do adventury panel východů 2 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Přidání panelu východů do adventury private List. View nastav. Vychody() { List. View
Přidat do třídy Prostor seznam východů /** * Vrací textový řetězec, který popisuje sousední východy)například: * "vychody: hala ". * *@return Seznam názvů sousedních prostorů */ public String seznam. Vychodu() { String vraceny. Text = "vychody: "; for (Prostor sousedni : vychody) { vraceny. Text += " " + sousedni. get. Nazev(); } return vraceny. Text; } 4 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Přidání popisu prostoru do horního panelu okno prostoru panel východů 5 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Přidání popisu prostoru do horního panelu Horní panel změníme na Flow. Pane – vložíme do něj Text. Areu a Anchor. Pane s obrázkem a teckou private Flow. Pane nastav. Horni. Panel() { Flow. Pane horni. Panel = new Flow. Pane(); Anchor. Pane obrazek. Pane = new Anchor. Pane(); Image. View obrazek = new Image. View(new Image(Adventura. Zakladni. class. get. Resource. As. Stream(". . /zdroje/planek. png"), 400, 250, false)); tecka = new Circle(10, Paint. value. Of("red")); Anchor. Pane. set. Top. Anchor(tecka, 25. 0); Anchor. Pane. set. Left. Anchor(tecka, 100. 0); obrazek. Pane. get. Children(). add. All(obrazek, tecka); Text. Area popis = new Text. Area(); popis. set. Pref. Width(350); popis. set. Text(hra. get. Herni. Plan(). get. Aktualni. Prostor(). dlouhy. Popis()); popis. set. Editable(false); horni. Panel. get. Children(). add. All(popis, obrazek. Pane); return horni. Panel; } 6 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Ovladač události Text. Fieldu těsná vazba prikaz. Text. Field. set. On. Action(new Event. Handler
Návrhový vzor Observer 8 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Použití návrhového vzoru Observer v adventuře 9 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Nejprve osamostatníme třídu Okno. Prostoru public class Okno. Prostoru { private Herni. Plan plan; private Flow. Pane horni. Panel; public Okno. Prostoru(Herni. Plan plan) { this. plan = plan; init(); } private void init() { horni. Panel = new Flow. Pane(); Anchor. Pane obrazek. Pane = new Anchor. Pane(); Image. View obrazek = new Image. View(new Image(Adventura. Zakladni. class. get. Resource. As. Stream(". . /zdroje/planek. png"), 400, 250, false)); Circle tecka = new Circle(10, Paint. value. Of("red")); Anchor. Pane. set. Top. Anchor(tecka, 25. 0); Anchor. Pane. set. Left. Anchor(tecka, 100. 0); obrazek. Pane. get. Children(). add. All(obrazek, tecka); popis = new Text. Area(); popis. set. Pref. Width(350); popis. set. Text(plan. get. Aktualni. Prostor(). dlouhy. Popis()); popis. set. Editable(false); horni. Panel. get. Children(). add(popis); horni. Panel. get. Children(). add(obrazek. Pane); } public Flow. Pane get. Panel() { return horni. Panel; } } Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Nejprve osamostatníme třídu Panel. Vychodu public class Panel. Vychodu { private Herni. Plan plan; List. View
Upravíme třídu Adventura. Zakladni, aby pracovala s třídami Okno. Prostoru a Panel. Vychodu public class Adventura. Zakladni extends Application { private Text. Area center. Text. Area; private IHra hra; private Text. Field prikaz. Text. Field; private Border. Pane border; private Okno. Prostoru okno. Prostoru; private Panel. Vychodu panel. Vychodu ; @Override public void start(Stage primary. Stage) { hra = new Hra(); border = new Border. Pane(); nastav. Text. Area(); border. set. Center(center. Text. Area); border. set. Bottom(nastav. Dolni. Panel()); okno. Prostoru = new Okno. Prostoru(hra. get. Herni. Plan()); border. set. Top(okno. Prostoru. get. Panel()); panel. Vychodu = new Panel. Vychodu(hra. get. Herni. Plan()); border. set. Right(panel. Vychodu. get. List()); Scene scene = new Scene(border, 800, 650); primary. Stage. set. Title("Adventura"); primary. Stage. set. Scene(scene); 12 prikaz. Text. Field. request. Focus(); primary. Stage. show(); } Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Rozhraní pro návrhový vzor Observer § nový balíček util § v něm New/Interface interface Subjekt. Zmeny. Prostoru interface Observer. Zmeny. Prostoru 13 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
interface Subjekt. Zmeny. Prostoru public interface Subjekt. Zmeny. Prostoru { /** * Metoda slouží k zaregistrování pozorovatele, musí to být instance třídy, * která implementuje rozhraní Observer. Zmeny. Prostoru. * * @param pozorovatel registrovaný objekt */ public void zaregistruj. Pozorovatele(Observer. Zmeny. Prostoru pozorovatel); /** * Metoda slouží k zrušení registrace pozorovatele, musí to být instance třídy, * která implementuje rozhraní Observer. Zmeny. Prostoru. * * @param pozorovatel objekt, který již nechce být informován o změnách */ public void odregistruj. Pozorovatele(Observer. Zmeny. Prostoru pozorovatel); 14 /** * Metoda, která se volá vždy, když dojde ke změně této instance. * Upozorní všechny pozorovatele, že došlo ke změně tak, že zavolá jejich metodu aktualizuj. */ public void upozorni. Pozorovatele(); } Kurz 4 IT 115 cvičení ©Alena Buchalcevová
interface Observer. Zmeny. Prostoru public interface Observer. Zmeny. Prostoru { /** * Metoda, ve které proběhne aktualizace pozorovatele, * je volána prostřednictvím metody upozorni. Pozorovatele z rozhraní Subjekt. Zmeny. Prostoru * * @param aktualni. Prostor */ public void aktualizuj(); } 15 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Třída Okno. Prostoru jako observer /1 public class Okno. Prostoru implements Observer. Zmeny. Prostoru { private private Herni. Plan plan; Flow. Pane horni. Panel; Stack. Pane obrazek. Pane; Circle tecka ; Text. Area popis ; Musí se zaregistrovat k subjektu public Okno. Prostoru(Herni. Plan plan) { this. plan = plan; plan. zaregistruj. Pozorovatele(this); init(); } private void init() { horni. Panel = new Flow. Pane(); obrazek. Pane = new Anchor. Pane(); Image. View obrazek = new Image. View(new Image(Adventura. Zakladni. class. get. Resource. As. Stream(". . /zdroje/planek. png"), 400, 250, false)); tecka = new Circle(10, Paint. value. Of("red")); Anchor. Pane. set. Top. Anchor(tecka, 25. 0); Anchor. Pane. set. Left. Anchor(tecka, 100. 0); obrazek. Pane. get. Children(). add. All(obrazek, tecka); popis = new Text. Area(); popis. set. Pref. Width(350); popis. set. Editable(false); } horni. Panel. get. Children(). add(popis); horni. Panel. get. Children(). add(obrazek. Pane); aktualizuj();
Třída Okno. Prostoru jako observer /2 Poskytuje Flow. Pane, aby jej bylo možné vložit do Border. Pane public Flow. Pane get. Panel() { return horni. Panel; } @Override public void aktualizuj() { // aktualizuj popis prostoru popis. set. Text(plan. get. Aktualni. Prostor(). dlouhy. Popis()); //aktualizuj umisteni tecky Anchor. Pane. set. Top. Anchor(tecka, plan. get. Aktualni. Prostor(). get. Pos. Top()); Anchor. Pane. set. Left. Anchor(tecka, plan. get. Aktualni. Prostor(). get. Pos. Left()); Aktualizace pozorovatele } } Získá posun od horní hrany a levé hrany z aktuálního prostoru 17 Kurz 4 IT 115 cvičení ©Alena Buchalcevová
Třída Panel. Vychodu jako observer public class Panel. Vychodu implements Observer. Zmeny. Prostoru { private Herni. Plan plan; List. View
Úprava třídy Herni. Plan - subjekt deklarace public class Herni. Plan implements Subjekt. Zmeny. Prostoru{ private List
Úprava třídy Herni. Plan – pokr. Při změně prostoru se upozorní pozorovatelé public void set. Aktualni. Prostor(Prostor prostor { aktualni. Prostor = prostor; upozorni. Pozorovatele(); . . } Implementace metod rozhraní Subjekt. Zmeny. Prostoru public void zaregistruj. Pozorovatele(Observer. Zmeny. Prostoru pozorovatel) { seznam. Pozorovatelu. add(pozorovatel); } public void odregistruj. Pozorovatele(Observer. Zmeny. Prostoru pozorovatel) { seznam. Pozorovatelu. remove(pozorovatel); } 20 public void upozorni. Pozorovatele() { for (Observer. Zmeny. Prostoru pozorovatel : seznam. Pozorovatelu){ pozorovatel. aktualizuj(); } } Kurz 4 IT 115 cvičení ©Alena Buchalcevová