---
# System prepended metadata

title: OBSERVER он же наблюдатель

---

# OBSERVER он же наблюдатель
```python 

# собсна говоря наш наблюдатель
class Observer:
    # список подписчиков которых нужно оповестить
    _list_observers = []

    @classmethod
    def add_observer(cls, value):
        cls._list_observers.append(value)
    
    @classmethod
    def del_observer(cls, value):
        del cls._list_observers[cls._list_observers.index(value)]
    
    # метод который дергается у источника 
    # после чего идет перебор подписчиков 
    # и вызов каких-либо действий на их стороне 
    @classmethod
    def update(cls, value):
        for observer in cls._list_observers:
            observer.change_health(value)

            
# первый подписчик
class ViewHealth():
    def __init__(self, observer):
        observer.add_observer(self)

    def view_healf(self, value):
        print("view 1:", value)
        
    # обязательный метод который нужен наблюдателю аля интерфейс
    def change_health(self, value):
        self.view_healf(value)

        
# второй подписчик
class ViewHealth_2():
    def __init__(self, observer):
        observer.add_observer(self)

    def view_healf(self, value):
        print("view 2:", value)

    def change_health(self, value):
        self.view_healf(value)


# третьий подписчик
class ViewHealth_3():
    def __init__(self, observer):
        observer.add_observer(self)

    def view_healf(self, value):
        print("view 3:", value)

    def change_health(self, value):
        self.view_healf(value)


# класс источник 
class Health(Observer):
    def __init__(self):
        self.health = 10
        super(Observer, self).__init__()
    
    # дергаем у него обновление значения и запускаем событие
    # у наблюдателя что алярма значение поменялось
    def update(self, value):
        self.health += value
        super().update(self.health)


if __name__ == '__main__':
    # инитим класс источник
    health = Health()
    # регаем подписчиков 
    # ! реализация так себе чисто для примера !
    # в оригинале это должно быть в динамике
    ViewHealth(Observer)
    ViewHealth_2(Observer)
    ViewHealth_3(Observer)
    # запускаем беск цикл 
    # где обновляем значение 
    # класса источника и смотрим на магию
    while True:
        val = int(input("enter new health: "))
        health.update(val)


```

output:
```bash!
PS E:\DEV\python\mapper_med> python .\main_3.py
enter new health: 10
view 1: 20        
view 2: 20        
view 3: 20        
enter new health: 20
view 1: 40        
view 2: 40        
view 3: 40        
...
```