Návrhový vzor Observer Adventura
Přidání panelu východů do adventury
Přidání panelu východů do adventury
Přidat do třídy Prostor seznam východů
Přidání popisu prostoru do horního panelu
Přidání popisu prostoru do horního panelu
Ovladač události TextFieldu těsná vazba
Návrhový vzor Observer
Použití návrhového vzoru Observer v adventuře
Nejprve osamostatníme třídu OknoProstoru
Nejprve osamostatníme třídu PanelVychodu
Upravíme třídu AdventuraZakladni, aby pracovala s třídami OknoProstoru a PanelVychodu
Rozhraní pro návrhový vzor Observer
interface SubjektZmenyProstoru
interface ObserverZmenyProstoru
Třída OknoProstoru jako observer /1
Třída OknoProstoru jako observer /2
Třída PanelVychodu jako observer
Úprava třídy HerniPlan - subjekt
Úprava třídy HerniPlan – pokr.
424.46K
Категория: ИнформатикаИнформатика

Návrhový vzor Observer Adventura

1. Návrhový vzor Observer Adventura

Kurz 4IT115
od ZS 2015
4. cvičení
Návrhový vzor Observer
Adventura
Alena Buchalcevová
katedra informačních technologií
Vysoká škola ekonomická v Praze
[email protected]

2. Přidání panelu východů do adventury

panel východů
2
Kurz 4IT115 cvičení
©Alena Buchalcevová

3. Přidání panelu východů do adventury

private ListView nastavVychody() {
ListView<String> list = new ListView<>();
ObservableList<String> data = FXCollections.observableArrayList();
list.setItems(data);
list.setPrefWidth(100);
String vychody = hra.getHerniPlan().getAktualniProstor().seznamVychodu();
String[] oddeleneVychody = vychody.split(" ");
for (int i = 1; i < oddeleneVychody.length; i++) {
data.add(oddeleneVychody[i]);
}
return list ;
}
3
Do metody start přidat
border.setRight(nastavVychody());
Metoda seznamVychodu
ve třídě Prostor není –
přidat – další slide
Kurz 4IT115 cvičení
©Alena Buchalcevová

4. 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 seznamVychodu() {
String vracenyText = "vychody:";
for (Prostor sousedni : vychody) {
vracenyText += " " + sousedni.getNazev();
}
return vracenyText;
}
4
Kurz 4IT115 cvičení
©Alena Buchalcevová

5. Přidání popisu prostoru do horního panelu

okno prostoru
panel východů
5
Kurz 4IT115 cvičení
©Alena Buchalcevová

6. Přidání popisu prostoru do horního panelu

Horní panel změníme na
FlowPane – vložíme do
něj TextAreu a
AnchorPane s obrázkem
a teckou
private FlowPane nastavHorniPanel() {
FlowPane horniPanel = new FlowPane();
AnchorPane obrazekPane = new AnchorPane();
ImageView obrazek = new ImageView(new
Image(AdventuraZakladni.class.getResourceAsStream("../zdroje/planek.png"), 400, 250, false, false));
tecka = new Circle(10, Paint.valueOf("red"));
AnchorPane.setTopAnchor(tecka, 25.0);
AnchorPane.setLeftAnchor(tecka, 100.0);
obrazekPane.getChildren().addAll(obrazek, tecka);
TextArea popis = new TextArea();
popis.setPrefWidth(350);
popis.setText(hra.getHerniPlan().getAktualniProstor().dlouhyPopis());
popis.setEditable(false);
horniPanel.getChildren().addAll(popis,obrazekPane);
return horniPanel;
}
6
Kurz 4IT115 cvičení
©Alena Buchalcevová

7. Ovladač události TextFieldu těsná vazba

prikazTextField.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String radek = prikazTextField.getText();
String text = hra.zpracujPrikaz(radek);
centerTextArea.appendText("\n\n" + radek + "\n");
centerTextArea.appendText("\n" + text + "\n");
// aktualizuj vychody
border.setRight(nastavVychody());
Je třeba aktualizovat
panel východů
// aktualizuj okno prostoru
prikazTextField.setText("");
if (hra.konecHry()) {
prikazTextField.setEditable(false);
}
7
Je třeba aktualizovat
okno prostoru
Kód tu není – bude se
realizovat observerem
}
});
Kurz 4IT115 cvičení
©Alena Buchalcevová

8. Návrhový vzor Observer

8
Kurz 4IT115 cvičení
©Alena Buchalcevová

9. Použití návrhového vzoru Observer v adventuře

9
Kurz 4IT115 cvičení
©Alena Buchalcevová

10. Nejprve osamostatníme třídu OknoProstoru

public class OknoProstoru {
private HerniPlan plan;
private FlowPane horniPanel;
public OknoProstoru(HerniPlan plan) {
this.plan = plan;
init();
}
private void init() {
horniPanel = new FlowPane();
AnchorPane obrazekPane = new AnchorPane();
ImageView obrazek = new ImageView(new Image(AdventuraZakladni.class.getResourceAsStream("../zdroje/planek.png"), 400, 250,
false, false));
Circle tecka = new Circle(10, Paint.valueOf("red"));
AnchorPane.setTopAnchor(tecka, 25.0);
AnchorPane.setLeftAnchor(tecka, 100.0);
obrazekPane.getChildren().addAll(obrazek, tecka);
popis = new TextArea();
popis.setPrefWidth(350);
popis.setText(plan.getAktualniProstor().dlouhyPopis());
popis.setEditable(false);
horniPanel.getChildren().add(popis);
horniPanel.getChildren().add(obrazekPane);
}
public FlowPane getPanel() {
return horniPanel;
}
}
Kurz 4IT115 cvičení
©Alena Buchalcevová

11. Nejprve osamostatníme třídu PanelVychodu

public class PanelVychodu {
private HerniPlan plan;
ListView<String> list;
ObservableList<String> data;
public PanelVychodu(HerniPlan plan) {
this.plan = plan;
init();
}
private void init() {
list = new ListView<>();
data = FXCollections.observableArrayList();
list.setItems(data);
list.setPrefWidth(100);
String vychody = plan.getAktualniProstor().seznamVychodu();
String[] oddeleneVychody = vychody.split(" ");
for (int i = 1; i < oddeleneVychody.length; i++) {
data.add(oddeleneVychody[i]);
}
}
public ListView<String> getList() {
return list;
}
11
}
Kurz 4IT115 cvičení
©Alena Buchalcevová

12. Upravíme třídu AdventuraZakladni, aby pracovala s třídami OknoProstoru a PanelVychodu

public class AdventuraZakladni extends Application {
private TextArea centerTextArea;
private IHra hra;
private TextField prikazTextField;
private BorderPane border;
private OknoProstoru oknoProstoru;
private PanelVychodu panelVychodu ;
@Override
public void start(Stage primaryStage) {
hra = new Hra();
border = new BorderPane();
nastavTextArea();
border.setCenter(centerTextArea);
border.setBottom(nastavDolniPanel());
oknoProstoru = new OknoProstoru(hra.getHerniPlan());
border.setTop(oknoProstoru.getPanel());
panelVychodu = new PanelVychodu(hra.getHerniPlan());
border.setRight(panelVychodu.getList());
Scene scene = new Scene(border, 800, 650);
primaryStage.setTitle("Adventura");
primaryStage.setScene(scene);
12
prikazTextField.requestFocus();
primaryStage.show();
}
Kurz 4IT115 cvičení
©Alena Buchalcevová

13. Rozhraní pro návrhový vzor Observer

nový balíček util
v něm New/Interface
interface SubjektZmenyProstoru
interface ObserverZmenyProstoru
13
Kurz 4IT115 cvičení
©Alena Buchalcevová

14. interface SubjektZmenyProstoru

public interface SubjektZmenyProstoru {
/**
* Metoda slouží k zaregistrování pozorovatele, musí to být instance třídy,
* která implementuje rozhraní ObserverZmenyProstoru.
*
* @param pozorovatel registrovaný objekt
*/
public void zaregistrujPozorovatele(ObserverZmenyProstoru pozorovatel);
/**
* Metoda slouží k zrušení registrace pozorovatele, musí to být instance třídy,
* která implementuje rozhraní ObserverZmenyProstoru.
*
* @param pozorovatel objekt, který již nechce být informován o změnách
*/
public void odregistrujPozorovatele(ObserverZmenyProstoru 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 upozorniPozorovatele();
}
Kurz 4IT115 cvičení
©Alena Buchalcevová

15. interface ObserverZmenyProstoru

public interface ObserverZmenyProstoru {
/**
* Metoda, ve které proběhne aktualizace pozorovatele,
* je volána prostřednictvím metody upozorniPozorovatele z rozhraní
SubjektZmenyProstoru
*
* @param aktualniProstor
*/
public void aktualizuj();
}
15
Kurz 4IT115 cvičení
©Alena Buchalcevová

16. Třída OknoProstoru jako observer /1

public class OknoProstoru implements ObserverZmenyProstoru {
private
private
private
private
private
HerniPlan plan;
FlowPane horniPanel;
StackPane obrazekPane;
Circle tecka ;
TextArea popis ;
Musí se zaregistrovat k
subjektu
public OknoProstoru(HerniPlan plan) {
this.plan = plan;
plan.zaregistrujPozorovatele(this);
init();
}
private void init() {
horniPanel = new FlowPane();
obrazekPane = new AnchorPane();
ImageView obrazek = new ImageView(new
Image(AdventuraZakladni.class.getResourceAsStream("../zdroje/planek.png"), 400, 250, false, false));
tecka = new Circle(10, Paint.valueOf("red"));
AnchorPane.setTopAnchor(tecka, 25.0);
AnchorPane.setLeftAnchor(tecka, 100.0);
obrazekPane.getChildren().addAll(obrazek, tecka);
popis = new TextArea();
popis.setPrefWidth(350);
popis.setEditable(false);
}
horniPanel.getChildren().add(popis);
horniPanel.getChildren().add(obrazekPane);
aktualizuj();

17. Třída OknoProstoru jako observer /2

Poskytuje FlowPane, aby jej
bylo možné vložit do
BorderPane
public FlowPane getPanel() {
return horniPanel;
}
@Override
public void aktualizuj() {
// aktualizuj popis prostoru
popis.setText(plan.getAktualniProstor().dlouhyPopis());
//aktualizuj umisteni tecky
AnchorPane.setTopAnchor(tecka, plan.getAktualniProstor().getPosTop());
AnchorPane.setLeftAnchor(tecka, plan.getAktualniProstor().getPosLeft());
Aktualizace pozorovatele
}
}
Získá posun od horní hrany a
levé hrany z aktuálního
prostoru
17
Kurz 4IT115 cvičení
©Alena Buchalcevová

18. Třída PanelVychodu jako observer

public class PanelVychodu implements ObserverZmenyProstoru {
private HerniPlan plan;
ListView<String> list;
ObservableList<String> data;
Musí se zaregistrovat k
subjektu
public PanelVychodu(HerniPlan plan) {
this.plan = plan;
plan.zaregistrujPozorovatele(this);
init();
}
private void init() {
list = new ListView<>();
data = FXCollections.observableArrayList();
list.setItems(data);
list.setPrefWidth(100);
aktualizuj();
}
public ListView<String> getList() {
return list;
}
}
@Override
public void aktualizuj() {
String vychody = plan.getAktualniProstor().seznamVychodu();
data.clear();
String[] oddeleneVychody = vychody.split(" ");
for (int i = 1; i < oddeleneVychody.length; i++) {
data.add(oddeleneVychody[i]);
}
}
Aktualizace pozorovatele

19. Úprava třídy HerniPlan - subjekt

deklarace
public class HerniPlan implements SubjektZmenyProstoru{
private List<ObserverZmenyProstoru> seznamPozorovatelu ;
public HerniPlan() {
....
seznamPozorovatelu = new ArrayList<>();
.....
konstruktor
}
19
Kurz 4IT115 cvičení
©Alena Buchalcevová

20. Úprava třídy HerniPlan – pokr.

Při změně prostoru se
upozorní pozorovatelé
public void setAktualniProstor(Prostor prostor {
aktualniProstor = prostor;
upozorniPozorovatele();
....
}
Implementace metod
rozhraní
SubjektZmenyProstoru
public void zaregistrujPozorovatele(ObserverZmenyProstoru pozorovatel) {
seznamPozorovatelu.add(pozorovatel);
}
public void odregistrujPozorovatele(ObserverZmenyProstoru pozorovatel) {
seznamPozorovatelu.remove(pozorovatel);
}
20
public void upozorniPozorovatele() {
for (ObserverZmenyProstoru pozorovatel :seznamPozorovatelu){
pozorovatel.aktualizuj();
}
}
Kurz 4IT115 cvičení
©Alena Buchalcevová
English     Русский Правила