Шаблонът за проектиране на наблюдател е шаблон за проектиране на софтуер, който определя връзка едно към много между обекти, където един обект (субектът) поддържа списък на своите зависими лица(наблюдателите) и ги уведомява автоматично за всякакви промени в състоянието. Този модел често се използва за внедряване на управлявани от събития системи, където обектите трябва да бъдат уведомени за промени в други обекти.

В C# шаблонът за проектиране на наблюдателя може да бъде имплементиран с помощта на следния код:

public interface IObserver
{
    void Update(string message);
}

public class Observer : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine("Received message: " + message);
    }
}

public class Subject
{
    private List<IObserver> observers = new List<IObserver>();
    public void AddObserver(IObserver observer)
    {
        observers.Add(observer);
    }
    public void RemoveObserver(IObserver observer)
    {
        observers.Remove(observer);
    }
    public void NotifyObservers(string message)
    {
        foreach (var observer in observers)
        {
            observer.Update(message);
        }
    }
}

В този пример интерфейсът IObserver дефинира метод за актуализиране на наблюдателя със съобщение. Класът Observer имплементира този интерфейс и записва съобщението в конзолата. Класът Subject поддържа списък с IObserver обекти и предоставя методи за добавяне и премахване на наблюдатели, както и метод за уведомяване на всички наблюдатели за съобщение.

В Python шаблонът за проектиране на наблюдателя може да бъде внедрен с помощта на следния код:

class Observer:
    def update(self, message):
        print("Received message: ", message)

class Subject:
    def __init__(self):
        self._observers = []

    def register_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self, message):
        for observer in self._observers:
            observer.update(message)

В този пример класът Observer има метод за актуализиране, който отпечатва съобщението при извикване. Класът Subject поддържа списък с обекти Observer и предоставя методи за добавяне и премахване на наблюдатели, както и метод за уведомяване на всички наблюдатели за съобщение.

Пример

Ето пример за това как моделът на наблюдател може да се използва в сценарий от реалния свят. Да приемем, че създавате приложение за търговия с акции. Можете да използвате модела наблюдател, за да уведомите търговците за всякакви промени в цените на акциите, в които са инвестирали. Цените на акциите ще бъдат обект, а търговците ще бъдат наблюдатели. Всеки път, когато цените на акциите се променят, субектът уведомява търговците за промяната.

Заключение

В заключение, Observer Design Pattern е мощен инструмент за внедряване на управлявани от събития системи и отделяне на обекти един от друг. Моделът е лесен за внедряване както в C#, така и в Python и може да се използва за решаване на широк кръг от проблеми в разработката на софтуер. Той насърчава хлабавото свързване между обектите и позволява лесното добавяне и премахване на наблюдатели, което прави кода по-лесен за поддръжка.