Letztes Mal erläuterte die Struktur des Observer-Musters anhand von zwei Hauskatzen und streunenden Katzen. Dieses Mal bittet Nyanko um die Funktion Observer.update um etwas anderes, anstatt gelötet zu werden. Die Erklärung basiert auf dem Inhalt von Letztes Mal. Bitte beziehen Sie sich zuerst darauf.
** Tama der Hauskatze ** Tama wohnt im 3. Stock der Wohnung. Der Besitzer lebt alleine.
** Hauskatzenpfirsich ** Vor kurzem bin ich gekommen, um im selben Haus wie Tama zu leben.
Es ist nicht nur Löten, das Tama den Besitzer fragt. Ich möchte, dass du spielst und ich mache mir Sorgen um Matatabi. Es gibt ungefähr zwei Möglichkeiten, dem Eigentümer mitzuteilen, welche Anfrage Sie stellen. Es werden ** Push-Typ ** über ein Argument übergeben und ** Pull-Typ ** ohne Argument übergeben (mit anderen Methoden). Der Code vorherige hat keine Argumente und wird daher als Pull-Typ klassifiziert. Für Prozesse, die keine Argumente empfangen müssen, ist es besser, den Pull-Typ zu verwenden. Wenn der Pull-Typ die erforderlichen Informationen enthält, sammelt die Observer-Klasse diese oder verwendet das, was sie weiß. Andererseits werden beim Push-Typ eine Zeichenfolge, ein numerischer Wert, eine Ereignisklasse (später beschrieben) usw. als Argumente übergeben.
Stellen Sie zunächst eine "Anfrage" an eine Klasse, damit Sie verschiedene Bettelarbeiten ausführen können.
Request.java
public abstract class Request{//Ereignisklasse
public abstract void words();
}
Food.java
public class Food extends Request{//Ereignisklasse
@Overide
public void words(){
System.out.println("Nya (ich habe Hunger)");
}
}
Playing.java
public class Playing extends Request{//Ereignisklasse
@Overide
public void words(){
System.out.println("Nya (Hima)");
}
}
Matatabi.java
public class Matatabi extends Request{//Ereignisklasse
@Overide
public void words(){
System.out.println("Nya (ich will Matatabi!)");
}
}
Das folgende Beispiel ist ein Push-Typcode mit der Anforderungsklasse (= Ereignisklasse) als Argument.
Cat.java
public class Cat{//Fachklasse
private Human human;
public void setHuman(Human human){// setObserver()
this.human = human;
}
public void hungry(){// notifyObservers()
this.human.called(new Food());
}
public void killTime(){// notifyObservers()
this.human.called(new Playing());
}
public void wantMatatabi(){// notifyObservers()
this.human.called(new Matatabi());
}
}
Human.java
public class Human{//Beobachterklasse
public void called(Request request){// notify() or update()
request.words();
String className = request.getClass().getName();
if(className.equals(Food.class.getName())){
System.out.println("Gib knusprig");
} else if(className.equals(killTime.class.getName())) {
System.out.println("Es kann nicht mehr geholfen werden (Nekojarashi Furi Furi)");
} else if(className.equals(Matatabi.class.getName())) {
System.out.println("Gib Matatabi");
}
}
}
Main.java
public static void main(String[] args) {
Cat tama = new Cat();
Human master = new Human();
tama.setHuman(master);
tama.hungry();
tama.killTime();
tama.wantMatatabi();
}
Nya (ich habe Hunger)
Gib knusprig
Nya (Hima)
Es kann nicht mehr geholfen werden (Nekojarashi Furi Furi)
Nya (ich will Matatabi!)
Gib Matatabi
Ein häufig zu übergebender Wert ist die aufrufende Subject-Klasse (= Cat-Klasse). Wenn die Observer-Klasse (= Human-Klasse) aus mehreren Subject-Klassen aufgerufen wird, ist dies praktisch, da der Anrufer bekannt sein kann.
Cat.java
public class Cat{//Fachklasse
private Human human;
private Request request;
public final String name;
public Cat(String name){
this.name = name;
}
public void setHuman(Human human){// setObserver()
this.human = human;
}
public void hungry(){// notifyObservers()
request = new Food();
this.human.called(this);
}
public void killTime(){// notifyObservers()
request = new Playing();
this.human.called(this);
}
public void wantMatatabi(){// notifyObservers()
request = new Matatabi();
this.human.called(this);
}
public Request getRequest(){
return request;
}
}
Human.java
public class Human{//Beobachterklasse
public void called(Cat cat){// notify() or update()
cat.getRequest().words();
String className = cat.getRequest().getClass().getName();
if(className.equals(Food.class.getName())){
System.out.println(cat.name + "Gib knusprig");
} else if(className.equals(killTime.class.getName())) {
System.out.println("Es kann nicht mehr geholfen werden (Nekojarashi Furi Furi)");
} else if(className.equals(Matatabi.class.getName())) {
System.out.println(cat.name + "Gib Matatabi");
}
}
}
Main.java
public static void main(String[] args) {
Cat tama = new Cat("Tama");
Cat momo = new Cat("Pfirsich");
Human master = new Human();
tama.setHuman(master);
momo.setHuman(master);
tama.hungry();
tama.killTime();
momo.hungry();
tama.wantMatatabi();
}
Nya (ich habe Hunger)
Gib Tama einen Crunch
Nya (Hima)
Es kann nicht mehr geholfen werden (Nekojarashi Furi Furi)
Nya (ich habe Hunger)
Geben Sie den Pfirsich knusprig
Nya (ich will Matatabi!)
Gib Tama Matatabi
Mit der Java Observer-Klasse können Sie die aufrufende Subject-Klasse (in Java als Observable-Klasse bezeichnet) und das Object im Allgemeinen als Argumente verwenden.
Ich bin mir immer noch nicht sicher, ob ich den Push-Typ oder den Pull-Typ (Lernen) verwenden soll. Bitte schauen Sie sich die Referenzmaterialien an.
Letztes Mal freute sich sehr über viele Likes. Vielen Dank. Ich war ziemlich überrascht, den vorherigen Artikel im Qiita-Ranking zu sehen, den ich normalerweise sehe (ich habe einen Squeeze genommen). Ich hoffe, dieser Artikel ist auch für Sie nützlich.
[1][https://qiita.com/varmil/items/8cd8fe9da510e31d940a] [2][http://d.hatena.ne.jp/backpaper0/20111111/1321012118] [3][http://apsec99-www.se.cs.titech.ac.jp/local/material/design-patterns/resources/19.html]