Понимание разницы между наблюдателем и наблюдаемым в программировании

В программировании термины «Наблюдатель» и «Наблюдаемый» обычно используются для реализации шаблона проектирования «Наблюдатель». Этот шаблон позволяет объектам взаимодействовать друг с другом слабосвязанным образом, при котором изменения в одном объекте автоматически распространяются на другие зависимые объекты. В этой статье блога мы рассмотрим разницу между Observer и Observable и приведем примеры кода их использования.

Понимание шаблона наблюдателя.
Шаблон наблюдателя — это шаблон поведенческого проектирования, который определяет зависимость «один ко многим» между объектами. Он состоит из двух основных компонентов: Observer и Observable.

Наблюдатель:
Наблюдатель — это объект, который заинтересован в получении обновлений или уведомлений при возникновении изменений в другом объекте, известном как Observable. Observer определяет интерфейс или метод обратного вызова, который вызывается Observable при возникновении изменений. Затем он может соответствующим образом отреагировать на изменение.

Наблюдаемый:
Наблюдаемый, также известный как Субъект, — это объект, за которым наблюдают один или несколько наблюдателей. Он поддерживает список наблюдателей и уведомляет их всякий раз, когда в его состоянии происходит изменение. Observable предоставляет методы для регистрации и отмены регистрации наблюдателей, а также для уведомления их об изменениях.

Примеры кода.
Давайте рассмотрим несколько примеров кода на разных языках программирования, чтобы проиллюстрировать использование Observer и Observable.

  1. Java:

    import java.util.Observable;
    import java.util.Observer;
    class MyObservable extends Observable {
    private int data;
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
        setChanged();
        notifyObservers();
    }
    }
    class MyObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        MyObservable observable = (MyObservable) o;
        System.out.println("Data changed: " + observable.getData());
    }
    }
    public class ObserverPatternExample {
    public static void main(String[] args) {
        MyObservable observable = new MyObservable();
        MyObserver observer = new MyObserver();
        observable.addObserver(observer);
        observable.setData(10); // Output: Data changed: 10
    }
    }
  2. Python:

    
    class Observable:
    def __init__(self):
        self.observers = []
        self.data = None
    def register_observer(self, observer):
        self.observers.append(observer)
    def unregister_observer(self, observer):
        self.observers.remove(observer)
    def notify_observers(self):
        for observer in self.observers:
            observer.update(self)
    def set_data(self, data):
        self.data = data
        self.notify_observers()

class Observer:
def update(self, observable):
print(“Данные изменены:”, observable.data)

def main():
observable = Observable()
observer = Observer()
observable.register_observer(observer)
observable.set_data(10) # Вывод: Данные изменены: 10

if name == “main “:
main()