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.
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.
Décrivez le couplage entre l'objet et l'observateur.
Prend en charge la communication de type diffusion.
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.
Lorsqu'il est nécessaire d'ajouter un nouvel observateur avec des changements minimes à l'avenir.
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);
}
}
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);
}
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);
}
}
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();
}
}
[Github:] https://github.com/CoralBeef-zz/PrintObserverExample
Recommended Posts