Учебники

Шаблоны проектирования — Шаблон наблюдателя

Шаблон наблюдателя используется, когда между объектами существует отношение «один ко многим», например, если один объект изменен, его зависимые объекты должны уведомляться автоматически. Модель наблюдателя подпадает под категорию поведенческих моделей.

Реализация

Шаблон Observer использует три класса актеров. Субъект, Наблюдатель и Клиент. Субъект — это объект, имеющий методы для присоединения и отсоединения наблюдателей к клиентскому объекту. Мы создали абстрактный класс Observer и конкретный класс Subject, который расширяет класс Observer .

ObserverPatternDemo , наш демонстрационный класс, будет использовать Subject и конкретный объект класса, чтобы показать образец наблюдателя в действии.

UML Диаграмма Наблюдателя

Шаг 1

Создать предметный класс.

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

Шаг 2

Создать класс Observer.

Observer.java

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

Шаг 3

Создать конкретные классы наблюдателей

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

Шаг 4

Используйте предметные и конкретные объекты наблюдения.

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

Шаг 5

Проверьте вывод.