Шаблон событий против наблюдателя - PullRequest
0 голосов
/ 22 мая 2018

Давайте предположим: у нас есть один объект интереса и несколько объектов, заинтересованных в этом объекте (например, его состояние).Когда объект интереса изменяется каким-либо образом, другие хотят знать об этом.

Первый подход

Это похоже на классическую проблему, которая решается с помощью Pattern Observer.Когда интересующий объект изменяется, он вызывает методы для объектов, которые подписываются на событие.Простой.

Второй подход

Определить событие в интересующем объекте, при изменении вызвать это событие.Другие будут слушать это событие и вызывать на нем свои методы.

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

Я знаю эти концепции, но я ищу глубокое понимание проблемы.

Спасибо за любые подсказки!

1 Ответ

0 голосов
/ 07 октября 2018

Мало мыслей по теме с тех пор, как задал вопрос:

Я считаю проблему скорее основанной на мнении, но есть некоторые плюсы и минусы обоих подходов:

Подход, основанный на событиях, прощена мой взгляд:

public class Observable
{
    public event Action<object, object> OnStateChange;

    public void Event()
    {
        // do something
        // choose appropritate args
        OnStateChange.Invoke(null, null);
    }

    /* versus ************************************************/
    Observator[] observators;
    public void InformObservators()
    {
        foreach (Observator observator in observators)
            // choose appropritate args
            observator.UpdateState(null, null);
    }
}

public class Observator
{
    public Observator(Observable observable)
    {
        observable.OnStateChange += UpdateState;
    }
    /* versus ************************************************/
    public void UpdateState(object arg1, object arg2)
    {

    }
}

Как мы видим, шаблон Observator не будет сильно отличаться в двух подходах, но класс Observable будет иметь более простой метод информирования об изменениях, то есть Eventметод, который, на мой взгляд, легче поддерживать, чем InformObservers из второго подхода.

...