[JAVA] PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"

Récemment, j'ai expérimenté différents types de terminaux pour l'application JavaFX de mon projet.

Chaque fois qu'une application essaie d'imprimer quelque chose, les terminaux du terminal système, de la vue du terminal d'application et d'autres vues futures devraient pouvoir afficher la chaîne.

Nous avons maintenant déterminé que le modèle d'observateur est le meilleur moyen de résoudre ce problème.

Qu'est-ce que le modèle d'observateur?

Observateur = observateur

Ce modèle est un modèle dans lequel l'objet observateur reçoit une notification d'un changement d'état de l'objet à observer et effectue un traitement qui l'incarne.

Les avantages de l'utilisation de ce modèle sont:

  1. Décrivez le couplage entre l'objet et l'observateur.

  2. Prend en charge la communication de type diffusion.

comment utiliser:

  1. Lorsqu'il est nécessaire de refléter les changements d'état d'un objet sur un autre objet tout en maintenant les objets étroitement couplés.

  2. Lorsqu'il est nécessaire d'ajouter un nouvel observateur avec des changements minimes à l'avenir.

Observateur d'impression d'échantillon

PrintObserverUML.png

rôle

PrintObserver << Classe abstraite >>:

Tous les nœuds enfants de cette classe peuvent ajouter, supprimer et «(classes qui implémentent Printable)» des types de terminaux valides.

PrintObserver.java


import java.util.ArrayList;

public abstract class PrintObserver {
    private final ArrayList<Printable> printerList = new ArrayList<>();

    public void notifyAllPrinters(String toPrint) {
        if(!toPrint.equals("")) {
            for(Printable printer : printerList) {
                System.out.println("\n");
                printer.print(toPrint);
            }
        } else {
            System.out.println("Quitting! Thank you!");
        }
    }
    
    public void addPrinter(Printable printer) {
        this.printerList.add(printer);
    }
    
    public void removePrinter(Printable printer) {
        this.printerList.remove(printer);
    }
}

<< Interface >> imprimable:

Toutes les classes qui implémentent cette interface sont des observateurs, en attente de quelque chose à imprimer.

Printable.java


public interface Printable {
    void print(String toPrint);
}

PrintTerminal A et Piikun:

Il implémente Printable, donc si un nœud enfant de PrintObserver ajoute ce Printable et appelle une fonction appelée notifyAllObservers, il sera imprimé.

** Chaque imprimable contient sa propre implémentation d'impression qui est indépendante des autres imprimables. ** **

PrintTerminalA.java


public class PrintTerminalA implements Printable {
    @Override
    public void print(String toPrint) {
        System.out.println("This is terminal A");
        System.out.println("It seems that someone has printed this message: "+toPrint);
    }
}

Piikun.java


public class Piikun implements Printable
{
    @Override
    public void print(String toPrint) {
        System.out.println("salut! C'est pipi!");
        System.out.println("Merci de m'avoir envoyé ce qu'il faut imprimer. Le message est ici:");
        System.out.println(toPrint);
    }
    
}

PrintSource << Principal >>:

Contient la méthode principale. Ajoutez un échantillon imprimable à la liste et envoyez l'entrée utilisateur à toutes les classes imprimables.

PrintSource.java


import java.util.Scanner;

public class PrintSource extends PrintObserver {
    
    public PrintSource() {
        addPrinter(new PrintTerminalA());
        addPrinter(new Piikun());
        
        String toPrint = "~";
        while(!toPrint.equals("")) {
            System.out.print("\n\nEnter String to print: ");
            Scanner sc = new Scanner(System.in);
            toPrint = sc.nextLine();
            
            notifyAllPrinters(toPrint);
        }
    }
    
    public static void main(String[] args) {
        PrintSource printSource = new PrintSource();
    }
}

Téléchargez ce projet sur github:

[Github:] https://github.com/CoralBeef-zz/PrintObserverExample

Recommended Posts

PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Exemple d'application du modèle de conception (n ° 1)
Exemple de description et d'implémentation de BloomFilter (JAVA)
Modèle d'observateur
Comparaison Java et Swift (3) Implémentation de classe / héritage de classe / conception de classe
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~