[JAVA] Modèle de conception ~ Observateur ~

1.Tout d'abord

Voici un résumé du ** modèle d'observateur ** dans le modèle de conception du GoF.

2. Quel est le modèle Observer?

3. Exemple de diagramme de classes

Observer.PNG

4. Exemple de programme

C'est un programme qui génère des nombres au hasard et affiche des "nombres" et "*" en fonction des changements.

4-1. Interface de l'observateur

Une interface qui représente un observateur.

Observer.java


public interface Observer {
	public abstract void update(NumberGenerator generator);
}

4-2. Classe DigitObserver

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());
	}
}

4-3. Classe GraphObserver

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

4-4. Classe NumberGenerator

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();
}

4-5. Classe RandomNumberGenerator

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();
		}
	}
}

4-6. Classe principale

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();
	}
}

4-7. Résultat de l'exécution

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:**********************

5. Avantages

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.

  1. GitHub

7. Liste des modèles de conception

8. Référence

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

Modèle de conception ~ Observateur ~
Modèle d'observateur
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 ~
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
PrintObserver "Modèle de conception d'observateur: description et exemple d'implémentation"
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de prototype
Motif médiateur
Modèle d'itérateur
Motif composite
Modèle de constructeur
Modèle de pont
Modèle de commande
Modèle de constructeur
Modèle de stratégie
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Modèle de médiateur
Motif de façade
Modèle de visiteur
Modèle de pont
Repenser le modèle d'expression et de conception de flux Java8 Lambda - Modèle de commande -