Voici un résumé du ** modèle d'observateur ** dans le modèle de conception du GoF.
C'est un programme qui génère des nombres au hasard et affiche des "nombres" et "*" en fonction des changements.
Une interface qui représente un observateur.
Observer.java
public interface Observer {
public abstract void update(NumberGenerator generator);
}
C'est une classe qui exprime des nombres avec des nombres. Implémentez l'interface Observer.
DigitObserver.java
public class DigitObserver implements Observer {
public void update(NumberGenerator generator) {
System.out.println("DigitObserver:" + generator.getNumber());
}
}
C'est une classe qui représente des nombres dans un graphique simple. Implémentez l'interface Observer.
GraphObserver.java
public class GraphObserver implements Observer {
public void update(NumberGenerator generator) {
System.out.print("GraphObserver:");
int count = generator.getNumber();
for (int i = 0; i < count; i++) {
System.out.print("*");
}
System.out.println("");
}
}
Une classe abstraite qui représente un objet qui produit des nombres.
NumberGenerator.java
import java.util.ArrayList;
import java.util.Iterator;
public abstract class NumberGenerator {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
Iterator it = observers.iterator();
while (it.hasNext()) {
Observer o = (Observer) it.next();
o.update(this);
}
}
public abstract int getNumber();
public abstract void execute();
}
Une classe qui génère des nombres au hasard.
RandomNumberGenerator.java
import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int number;
public int getNumber() {
return number;
}
public void execute() {
for (int i = 0; i < 10; i++) {
number = random.nextInt(50);
notifyObservers();
}
}
}
Cette classe effectue le traitement principal.
Main.java
public class Main {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.execute();
}
}
DigitObserver:35
GraphObserver:***********************************
DigitObserver:33
GraphObserver:*********************************
DigitObserver:40
GraphObserver:****************************************
DigitObserver:28
GraphObserver:****************************
DigitObserver:4
GraphObserver:****
DigitObserver:45
GraphObserver:*********************************************
DigitObserver:7
GraphObserver:*******
DigitObserver:30
GraphObserver:******************************
DigitObserver:31
GraphObserver:*******************************
DigitObserver:22
GraphObserver:**********************
Dans le modèle Observer, la classe RandomNumberGenerator qui a un état, la classe DigitObserver qui vous informe du changement d'état et la classe GraphObserver apparaissent. Et ce qui relie les deux rôles, c'est l'interface Observer et la classe NumberGenerator. La classe RandomNumberGenerator ne sait pas si elle surveille actuellement une instance DigitObserver ou une instance GraphObserver. Cependant, je sais que l'instance stockée dans le champ observateurs hérite de l'interface Observer et est garantie de pouvoir appeler la méthode de mise à jour. En revanche, la classe DigitObserver et la classe GraphObserver ne savent pas s'il s'agit de l'instance RandomNumberGenerator ou d'une autre instance de XXXNumberGenerator qui s'observe. Cependant, je sais qu'il s'agit d'une instance d'une sous-classe de NumberGenerator et qu'il possède une méthode getNumber.
Cet article et exemple de programme ont été créés à partir des livres suivants.
C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.
Recommended Posts