[GO] Modèle d'observateur qui peut être vu dans Nyanko Partie 2

Aperçu

Dernière fois a expliqué la structure du modèle Observer en utilisant deux chats domestiques et des chats errants. Cette fois-ci, autour de la fonction Observer.update, Nyanko mendiera autre chose au lieu d'être soudé. L'explication est basée sur le contenu de Dernière fois, veuillez donc vous y référer en premier.

IMG_0756.JPG

Nyanko à comparaître

** Tama de chat domestique ** Tama habite au 3ème étage de l'appartement. Le propriétaire vit seul.

cat_matatabi.png

** Chat domestique pêche ** Récemment, je suis venu vivre dans la même maison que Tama.

cat_scottish_fold.png

Tama qui ne peut pas se contenter de souder

Ce n'est pas seulement la soudure que Tama demande au propriétaire. Je veux que tu joues et je m'inquiète pour Matatabi. Il existe à peu près deux façons de dire au propriétaire quelle demande vous faites. Il existe un ** type Push ** qui est passé via un argument et un ** type Pull ** qui est passé sans argument (en utilisant d'autres méthodes). Le code précédent n'a pas d'arguments et est donc classé comme un type d'extraction. Pour les processus qui n'ont pas besoin de recevoir d'arguments, il est préférable d'utiliser le type Pull. Si le type d'extraction contient les informations nécessaires, la classe Observer les collecte ou utilise ce qu'elle sait. En revanche, dans le type Push, une chaîne de caractères, une valeur numérique, une classe Event (décrite plus loin), etc. sont passées en arguments.

Faire une demande au propriétaire

Tout d'abord, faites une "demande" dans une classe afin que vous puissiez faire diverses mendicité.

Request.java


public abstract class Request{//Classe d'événement
    public abstract void words();
}

Food.java


public class Food extends Request{//Classe d'événement
    @Overide
    public void words(){
        System.out.println("Nya (j'ai faim)");
    }
}

Playing.java


public class Playing extends Request{//Classe d'événement
    @Overide
    public void words(){
        System.out.println("Nya (Hima)");
    }
}

Matatabi.java


public class Matatabi extends Request{//Classe d'événement
    @Overide
    public void words(){
        System.out.println("Nya (je veux Matatabi!)");
    }
}

uml4.png

Passer la classe Event

L'exemple suivant est un code de type Push avec la classe Request (= classe Event) comme argument.

Cat.java


public class Cat{//Classe de sujet
    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{//Classe d'observateur
    public void called(Request request){// notify() or update()
        request.words();

        String className = request.getClass().getName();
        if(className.equals(Food.class.getName())){
            System.out.println("Donner du croquant");

        } else if(className.equals(killTime.class.getName())) {
            System.out.println("Ça ne peut plus être aidé (Nekojarashi Furi Furi)");

        } else if(className.equals(Matatabi.class.getName())) {
            System.out.println("Donner 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 (j'ai faim)
Donner du croquant
Nya (Hima)
Ça ne peut plus être aidé (Nekojarashi Furi Furi)
Nya (je veux Matatabi!)
Donner Matatabi

Passer la classe Subject elle-même (this)

Une valeur courante à transmettre est la classe Subject appelante (= classe Cat) elle-même. Lorsque la classe Observer (= classe humaine) est appelée à partir de plusieurs classes Subject, cela est pratique car l'appelant peut être connu.

Cat.java


public class Cat{//Classe de sujet
    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{//Classe d'observateur
    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 + "Donner du croquant");

        } else if(className.equals(killTime.class.getName())) {
            System.out.println("Ça ne peut plus être aidé (Nekojarashi Furi Furi)");

        } else if(className.equals(Matatabi.class.getName())) {
            System.out.println(cat.name + "Donnez Matatabi à");
        }
    }
}

Main.java


    public static void main(String[] args) {
        Cat tama = new Cat("Tama");
        Cat momo = new Cat("pêche");
        Human master = new Human();
        tama.setHuman(master);
        momo.setHuman(master);

        tama.hungry();
        tama.killTime();
        momo.hungry();
        tama.wantMatatabi();
    }
Nya (j'ai faim)
Donnez à Tama un crunch
Nya (Hima)
Ça ne peut plus être aidé (Nekojarashi Furi Furi)
Nya (j'ai faim)
Donner du croquant à la pêche
Nya (je veux Matatabi!)
Donner Tama Matatabi

La classe Java Observer vous permet de prendre la classe Subject appelante (nommée classe Observable en Java) et l'Object en général comme arguments.

en conclusion

Je ne suis toujours pas sûr d'utiliser le type Push ou le type Pull (étude). Veuillez consulter les documents de référence.

La dernière fois était très heureux de recevoir de nombreux likes. Merci beaucoup. J'ai été assez surpris de voir l'article précédent dans le classement qiita que je vois habituellement (j'ai pris une pression). J'espère que cet article vous sera également utile.

Matériel de référence

[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

Modèle d'observateur qui peut être vu dans Nyanko Partie 2
Modèle d'observateur compris par Nyanko Partie 1
Modèle de conception #Observer
Modèle d'observateur en Java
Exemple de source du modèle Observer réalisé par Java, PHP, Python