Определите зависимость “один ко многим” между объектами, чтобы при изменении состояния одного объекта все его зависимые элементы уведомлялись и обновлялись автоматически.
- Субъект: знает своих наблюдателей. Любое количество объектов-наблюдателей может наблюдать за объектом. Предоставляет интерфейс для присоединения и отсоединения объектов наблюдателя.
- ConcreteSubject: сохраняет состояние, представляющее интерес для ConcreteObserver. Отправляет уведомление своим наблюдателям при изменении своего состояния
- Наблюдатель: определяет интерфейс обновления для объектов, которые должны получать уведомления об изменениях в объекте.
- ConcreteObserver: поддерживает ссылку на объект ConcreteSubject. Хранит состояние, которое должно соответствовать состоянию субъекта. Реализует интерфейс обновления наблюдателя, чтобы его состояние соответствовало состоянию объекта.
public class Main { public static void main(String[] args) { ConcreteSubject s = new ConcreteSubject(); s.attach(new ConcreteObserver(s, "X")); s.attach(new ConcreteObserver(s, "Y")); s.attach(new ConcreteObserver(s, "Z")); s.setSubjectState("ABC"); s.notifyObservers(); } } public class Subject { private Listobservers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer o : observers) { o.update(); } } } public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } } public interface Observer { void update(); } public class ConcreteObserver implements Observer { private String name; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject, String name) { this.subject = subject; this.name = name; } @Override public void update() { String observerState = subject.getSubjectState(); System.out.println("Observer " + name + " state is " + observerState); } }
Observer X state is ABC Observer Y state is ABC Observer Z state is ABC
public class Main { public static void main(String[] args) { ConcreteSubject s = new ConcreteSubject(); s.addObserver(new ConcreteObserver(s, "X")); s.addObserver(new ConcreteObserver(s, "Y")); s.addObserver(new ConcreteObserver(s, "Z")); s.setSubjectState("ABC"); s.notifyObservers(); } } import java.util.Observable; public class ConcreteSubject extends Observable { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; setChanged(); } } import java.util.Observable; import java.util.Observer; public class ConcreteObserver implements Observer { Observable subject; private String name; public ConcreteObserver(Observable subject, String name) { this.subject = subject; this.name = name; } @Override public void update(Observable obs, Object arg) { if(obs instanceof ConcreteSubject) { ConcreteSubject observable = (ConcreteSubject)obs; System.out.println("Observer " + name + " state is " + observable.getSubjectState()); } } }
eidherjulian61/дизайн-шаблоны
Основные шаблоны Проектирования
ид – 27 сентября ・ 1 минута чтения
Оригинал: “https://dev.to/eidher/observer-pattern-b18”