[GO] Beobachtermuster, das in Nyanko Teil 2 zu sehen ist

Überblick

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.

IMG_0756.JPG

Nyanko erscheint

** Tama der Hauskatze ** Tama wohnt im 3. Stock der Wohnung. Der Besitzer lebt alleine.

cat_matatabi.png

** Hauskatzenpfirsich ** Vor kurzem bin ich gekommen, um im selben Haus wie Tama zu leben.

cat_scottish_fold.png

Tama, die mit dem Löten nicht zufrieden sein kann

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.

Teilen Sie dem Eigentümer eine Anfrage mit

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!)");
    }
}

uml4.png

Bestehen Sie die Event-Klasse

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

Bestehen Sie die Subject-Klasse selbst (this)

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.

abschließend

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.

Referenzmaterial

[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]

Recommended Posts

Beobachtermuster, das in Nyanko Teil 2 zu sehen ist
Beobachtermuster von Nyanko Teil 1 verstanden
Entwurfsmuster #Observer
Beobachtermuster in Java
Beispielquelle für das von Java, PHP, Python realisierte Observer-Muster