Entwurfsmuster - Beobachtermuster

Das Beobachtermuster wird verwendet, wenn zwischen Objekten eine Eins-zu-Viele-Beziehung besteht, z. B. wenn ein Objekt geändert wird, müssen seine abhängigen Objekte automatisch benachrichtigt werden. Das Beobachtermuster fällt unter die Kategorie Verhaltensmuster.

Implementierung

Das Beobachtermuster verwendet drei Akteursklassen. Betreff, Beobachter und Kunde. Subjekt ist ein Objekt mit Methoden zum Anhängen und Trennen von Beobachtern an ein Clientobjekt. Wir haben eine abstrakte Klasse Observer und eine konkrete Klasse Subject erstellt , die die Klasse Observer erweitert .

ObserverPatternDemo , unsere Demo-Klasse, verwendet Subject und ein konkretes Klassenobjekt, um das Beobachtermuster in Aktion anzuzeigen.

Schritt 1

Betreffklasse erstellen.

Subject.java

import java.util.ArrayList;
import java.util.List;

public class Subject {
	
   private List<Observer> observers = new ArrayList<Observer>();
   private int state;

   public int getState() {
      return state;
   }

   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }

   public void attach(Observer observer){
      observers.add(observer);		
   }

   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update();
      }
   } 	
}

Schritt 2

Observer-Klasse erstellen.

Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

Schritt 3

Erstellen Sie konkrete Beobachterklassen

BinaryObserver.java

public class BinaryObserver extends Observer{

   public BinaryObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); 
   }
}

OctalObserver.java

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
     System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); 
   }
}

HexaObserver.java

public class HexaObserver extends Observer{

   public HexaObserver(Subject subject){
      this.subject = subject;
      this.subject.attach(this);
   }

   @Override
   public void update() {
      System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); 
   }
}

Schritt 4

Verwenden Sie Subjekt- und konkrete Beobachterobjekte.

ObserverPatternDemo.java

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();

      new HexaObserver(subject);
      new OctalObserver(subject);
      new BinaryObserver(subject);

      System.out.println("First state change: 15");	
      subject.setState(15);
      System.out.println("Second state change: 10");	
      subject.setState(10);
   }
}

Schritt 5

Überprüfen Sie die Ausgabe.

First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010