Рубрики
Без рубрики

Шаблон наблюдателя

Определите зависимость “один ко многим” между объектами, чтобы при изменении состояния одного объекта зависели все его объекты… Помеченный как поведенческий, шаблон, шаблоны проектирования, java.

Определите зависимость “один ко многим” между объектами, чтобы при изменении состояния одного объекта все его зависимые элементы уведомлялись и обновлялись автоматически.

  • Субъект: знает своих наблюдателей. Любое количество объектов-наблюдателей может наблюдать за объектом. Предоставляет интерфейс для присоединения и отсоединения объектов наблюдателя.
  • 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 List observers = 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”