CCCPaste

pbo-pertemuan-12-observer.py

from abc import ABC, abstractmethod

class Observer(ABC):
    """
    Interface untuk objek yang 'mengamati' (biasanya View).
    """
    @abstractmethod
    def update(self, subject, *args, **kwargs):
        pass

class Observable:
    """
    Kelas dasar untuk objek yang 'diamati' (biasanya Model).
    Memiliki daftar pengamat (observers) dan memberi tahu mereka jika ada perubahan.
    """
    def __init__(self):
        self._observers = []

    def add_observer(self, observer: Observer):
        if observer not in self._observers:
            self._observers.append(observer)

    def remove_observer(self, observer: Observer):
        if observer in self._observers:
            self._observers.remove(observer)

    def notify_observers(self, *args, **kwargs):
        """
        Memberi tahu semua observer bahwa ada perubahan data.
        """
        for observer in self._observers:
            observer.update(self, *args, **kwargs)