Как мы можем реализовать шаблон наблюдателя в .NET? - PullRequest
3 голосов
/ 03 марта 2010

В архитектуре .NET существует множество шаблонов проектирования. Я хочу знать, что подразумевается под шаблоном наблюдателя и как он реализован

Ответы [ 5 ]

6 голосов
/ 03 марта 2010

Шаблон Observer в C # в значительной степени реализован как события.

5 голосов
/ 03 марта 2010

Википедия подводит итог лучше всего:

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

Наблюдатель (иногда известный как шаблон publish-subscribe) лучше всего использовать на интерфейсах GUI для обновления состояний изменения объектов GUI, таких как все другие объекты, которые могут обновлять себя (например, изменение размера окна, тогда все объекты GUI, такие как кнопки, могут выровнять себя в зависимости от размера окна). Обычно это делается введением EventListeners (который является шаблоном Observer).

Для реализации, вы можете просмотреть учебник из:

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

1 голос
/ 16 декабря 2011

это простая реализация шаблона наблюдателя в C #, я добавил много комментариев, так что, надеюсь, вам будет понятно, что это на самом деле:)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleObserver
{
    class Program
    {
        static void Main(string[] args)
        {
            Newspaper newspaper = new Newspaper(); //create a Newspaper, which is a realization of Subject
            Grandma grandma = new Grandma(newspaper); //create a new Grandma, which is a realization of Observer
            newspaper.ChangeNews("no news today..."); //when the news get changed, grandma will automatically get it
            newspaper.ChangeNews("still no news..."); //and again
        }
    }

    //the subject which the observers are 'observing'
    //whenever something changes in the subject, the 
    //observers that are registered should be updated
    public interface Subject 
    {
        void RegisterObserver(Observer o); 
        void RemoveObserver(Observer o);
        void NotifyObservers(); 
    }

    //the actual subject, a newspaper which implements
    //the methods declared in the interface and it's own method
    //the goal is that whenever the news property changes 'by 
    //calling ChangeNews(string newNews); all the registered observers will
    //get that new news
    public class Newspaper : Subject
    {
        private List<Observer> observers = new List<Observer>(); //list with observers
        private string news = "initial news, nothing new!"; //the news

        public void RegisterObserver(Observer o)
        {
            this.observers.Add(o);
        }

        public void RemoveObserver(Observer o)
        {
            this.observers.Remove(o);
        }

        public void NotifyObservers()
        {
            foreach (Observer o in this.observers)
                o.Update(news); //update all the observers with the news
        }

        public void ChangeNews(string newNews) //method to manually change the news
        {
            this.news = newNews;
            this.NotifyObservers(); //automatically calls the NotifyObservers() method
        }
    }

    //the actual observer, has a method Update that will be
    //called by the Subject when something changes
    public interface Observer
    {
        void Update(string news);
    }

    //grandma is a observer, whenever the news changes she will be 
    //notified. she also has a reference to the subject instance, so
    //that she can cancel her subscription whenever needed
    public class Grandma : Observer
    {
        private Subject subject;

        public Grandma(Subject subject)
        {
            this.subject = subject; //set reference to the subject
            this.subject.RegisterObserver(this); //register to the subject
        }

        public void Update(string news)
        {
            Console.WriteLine("Granny reads the news, very slowly...");
            Console.WriteLine("The news today is... " + news);
        }
    }

    //possibly other observers go here...
}
1 голос
/ 03 марта 2010

Выезд DOFactory .

Они имеют:

  • UML-диаграммы Преимущества Недостатки
  • Краткое изложение основных предметов C #
  • реализация C # реализация для
  • пример задачи.
1 голос
/ 03 марта 2010

Хороший пример схемы наблюдателя показан на MSDN.

Вы можете найти его здесь:

http://msdn.microsoft.com/en-us/library/ms998543.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...