Similar presentations:
Návrhový vzor Observer Adventura
1. Návrhový vzor Observer Adventura
Kurz 4IT115od 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 prostorupanel východů
5
Kurz 4IT115 cvičení
©Alena Buchalcevová
6. Přidání popisu prostoru do horního panelu
Horní panel změníme naFlowPane – 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
8Kurz 4IT115 cvičení
©Alena Buchalcevová
9. Použití návrhového vzoru Observer v adventuře
9Kurz 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 utilv 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 jejbylo 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
deklaracepublic 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 seupozorní 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á