Обмен технологиями

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

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Основная идея паттерна наблюдателя

Шаблон наблюдателя также известен как шаблон публикации/подписки. GOF определяет шаблон наблюдателя следующим образом: Определите отношение зависимости «один ко многим» между объектами, позволяющее нескольким объектам-наблюдателям одновременно фокусироваться на одном и том же объекте. Когда состояние объекта изменяется, все объекты, которые от него зависят. Уведомляется и обновляется автоматически.
Как показано на рисунке ниже, шаблон наблюдателя содержит 5 типов объектов.
Вставьте сюда описание изображения

  • Целевой интерфейсСубъект: Целевой интерфейс определяет три интерфейса: добавить наблюдателя Attach(), удалить наблюдателя Detach() и уведомить наблюдателей notifyObservers(), а также определить свою собственную операционную функцию Operation().
  • Абстрактный целевой классAbstractSubject: Этот класс определяет вектор объекта-коллекции наблюдателей, который используется для хранения списка добавленных объектов-наблюдателей и реализует три функции для обновления: добавить наблюдателя Attach(), удалить наблюдателя Detach() и уведомить наблюдателей notifyObservers() Этот список также; уведомляет все объекты-наблюдатели о необходимости обновления.
  • Конкретный целевой класс MySubiect: Наследовать от абстрактного целевого класса AbstractSubiect и написать специальную операционную функцию для реализации операции(). В этой функции можно вызвать notifyObservers(), чтобы уведомить всех наблюдателей о необходимости обновления.
  • Интерфейс наблюдателя Наблюдатель: Определите единый интерфейс update() для объектов, которые должны уведомляться при изменении целевого класса. При вызове notifyObservers() будет вызываться функция update() для обновления.
  • конкретный наблюдатель : можно определить несколько объектов-наблюдателей, например Observer1 и Observer2, для написания унифицированных функций обновления. Client Test может реализовать мониторинг, добавив наблюдателя Observer в класс subject.

Давайте посмотрим на конкретную реализацию.

(1) Интерфейс наблюдателя Observer.java определяет унифицированный интерфейс обновления update(). Его исходный код показан в следующей программе.

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) Класс реализации наблюдателя Observer1.java является конкретной реализацией наблюдателя, и его функция обновления используется для вывода строки на консоль. Его исходный код показан в следующей программе.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) Класс реализации наблюдателя Observer2.java является конкретной реализацией другого наблюдателя, и его функция обновления используется для вывода строки на консоль. Его исходный код показан в следующей программе.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) Наблюдаемый интерфейс subject.java определяет три функции интерфейса для операционных наблюдателей и определяет конкретный интерфейс операционной функции для представления своих собственных функций. Его исходный код показан в следующей программе.

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) Наблюдаемый абстрактный класс AbstractSubject.java предоставляет вектор списка векторов для сохранения всех объектов-наблюдателей и записи функций реализации для управления объектами списка. Его исходный код показан в следующей программе.

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector