[JAVA] Entwurfsmuster ~ Beobachter ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Beobachtermusters ** im GoF-Entwurfsmuster.

2. Was ist das Beobachtermuster?

3. Beispielklassendiagramm

Observer.PNG

4. Beispielprogramm

Es ist ein Programm, das zufällig Zahlen generiert und entsprechend den Änderungen "Zahlen" und "*" anzeigt.

4-1. Beobachterschnittstelle

Eine Schnittstelle, die einen Beobachter darstellt.

Observer.java


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

4-2. DigitObserver-Klasse

Dies ist eine Klasse, die Zahlen mit Zahlen ausdrückt. Implementieren Sie die Observer-Schnittstelle.

DigitObserver.java


public class DigitObserver implements Observer {

	public void update(NumberGenerator generator) {
		System.out.println("DigitObserver:" + generator.getNumber());
	}
}

4-3. GraphObserver-Klasse

Dies ist eine Klasse, die Zahlen in einem einfachen Diagramm darstellt. Implementieren Sie die Observer-Schnittstelle.

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. NumberGenerator-Klasse

Eine abstrakte Klasse, die ein Objekt darstellt, das Zahlen erzeugt.

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. RandomNumberGenerator-Klasse

Eine Klasse, die zufällig Zahlen generiert.

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 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch.

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 Ausführungsergebnis

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. Vorteile

Im Observer-Muster werden die RandomNumberGenerator-Klasse mit einem Status, die DigitObserver-Klasse, die Sie über die Statusänderung benachrichtigt, und die GraphObserver-Klasse angezeigt. Und was die beiden Rollen verbindet, ist die Observer-Schnittstelle und die NumberGenerator-Klasse. Die RandomNumberGenerator-Klasse weiß nicht, ob sie derzeit eine DigitObserver-Instanz oder eine GraphObserver-Instanz überwacht. Ich weiß jedoch, dass die im Beobachterfeld gespeicherte Instanz von der Beobachterschnittstelle erbt und garantiert die Aktualisierungsmethode aufrufen kann. Andererseits wissen die DigitObserver-Klasse und die GraphObserver-Klasse nicht, ob es die RandomNumberGenerator-Instanz oder eine andere XXXNumberGenerator-Instanz ist, die sich selbst beobachtet. Ich weiß jedoch, dass es sich um eine Instanz einer Unterklasse von NumberGenerator handelt und eine getNumber-Methode hat.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.

Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen der Entwurfsmuster und Beispielprogramme sind geschrieben. Schauen Sie sich also auch die Bücher an.

Recommended Posts

Entwurfsmuster ~ Beobachter ~
Beobachtermuster
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
PrintObserver "Observer Design Pattern: Beschreibung und Implementierungsbeispiel"
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster
Überdenken des Entwurfsmusters mit Java8 Lambda-Ausdruck & Stream - Befehlsmuster -