Шаблон наблюдателя или привязка данных - PullRequest
2 голосов
/ 14 июля 2009

Мой вопрос: вы бы внедрили шаблон Observer или использовали привязку данных для выполнения следующих действий:

В данный момент я инициализирую список GuiDataObj. Когда событие инициируется, я смотрю GuiDataObjById и затем изменяю объект, который привязан к данным GuiElement; который обновляет графический интерфейс.

Существует несколько элементов GuiElement (на данный момент все одного типа, но это может измениться в будущем), я хочу иметь возможность изменять объект класса и иметь GuiElement для автоматического магического обновления GuiElement отраженное изменение.

public class GuiElement : ObservableImpl
{
    private string guiElementName;
    public String GuiElementName
    {
        get { return guiElementName; }
        set
        {
            guiElementName = value;
            NotifyObservers(guiElementName);
        }
    }

    private string status;
    public String Status
    {
        get { return status; }
        set
        {
            status = value;
            NotifyObservers(status);
        }
    }
}

public interface IObserver
{
    void Notify<T>(T watchObj);
}

public interface IObservable
{
    void Register(IObserver observer);
    void UnRegister(IObserver observer);
}

public class ObservableImpl : IObservable
{

    protected Hashtable _observerContainer = new Hashtable();

    public void Register(IObserver anObserver)
    {
        _observerContainer.Add(anObserver, anObserver);
    }

    public void UnRegister(IObserver anObserver)
    {
        _observerContainer.Remove(anObserver);
    }

    public void NotifyObservers<T>(T anObject)
    {
        foreach (IObserver anObserver in _observerContainer.Keys)
            anObserver.Notify(anObject);
    }
}

А затем мой GuiElement обновит графический интерфейс при получении уведомления об изменении?

public partial class GuiElementControl : UserControl, IObserver
{

    public GuiElementControl()
    {
        InitializeComponent();
    }

    #region Implementation of IObserver

    public void Notify<T>(T watchObj)
    {
        if (watchObj is GuiElement)
        {
            UpdateGui(watchObj);
        }
    }

    private static void UpdateGui(object obj)
    {
        GuiElement element = obj as GuiElement;
        if (element != null)
        {
            NameLbl.Text = element.GuiElementName;
            StatusLbl.Text = element.Status;
        }
    }

    #endregion

Было бы более гибким, если бы я реализовал привязку данных вместо уведомления наблюдателя об изменениях? Я предполагаю, что я действительно спрашиваю, какой самый гибкий способ визуального представления бизнес-объекта, который постоянно обновляется в режиме реального времени.

альтернативный текст http://devpupil.net/GuiConcept.PNG

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

Я бы использовал Observer. Графические интерфейсы, которые автоматически обновляют свои значения при изменении базовой модели / данных, которые они представляют, являются одним из классических примеров использования шаблона Observer.

1 голос
/ 14 июля 2009

Когда я разрабатывал наш проект, мы придумали шаблоны Observer и EventListener, как вы это сделали. Я считаю, что эти шаблоны имеют ту же концепцию, что и модель публикации / подписки. Мы выбрали способ EventListener (EventObject) для создания слабой связи между объектами и для большей расширяемости функций для событий.

Преимущество EventListener состоит в том, что мы можем добавить более разумные функции события (?) В EventListener на основе наших требований к событию. Пожалуйста, поправьте меня, если он пойдет не в ту сторону.

Надеюсь, это поможет.

Tiger.

...