我们如何在.NET中实现观察者模式?

时间:2010-03-03 10:22:13

标签: .net design-patterns

在.NET体系结构中,有很多设计模式。我想知道观察者模式的含义及其实现方式

5 个答案:

答案 0 :(得分:6)

Observer模式在C#中作为事件非常具体化。

答案 1 :(得分:5)

维基百科最好地总结了它:

  

观察者模式(观察者的一个子集)   发布/订阅模式)是一个   软件设计模式中的一个   对象,称为主题,维护   他的家属名单,叫做   观察者,并通知他们   任何状态变化的自动   通常通过打电话给他们之一   方法。它主要用于   实现分布式事件处理   系统

观察者(有时称为publish-subscribe模式)最适用于GUI界面,以更新GUI对象的更改状态,例如所有其他对象都可以更新自身(例如,调整窗口大小,然后是所有gui对象,例如按钮可以根据窗口的大小重新对齐。这通常是通过引入EventListeners(这是一个观察者模式)来完成的。

要实现,您可以从以下任一位置查看教程:

希望这有帮助。

答案 2 :(得分:1)

观察者模式的一个很好的例子显示在MSDN上。

你可以在这里找到它:

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

答案 3 :(得分:1)

结帐DOFactory

他们有:

  • UML图表优点缺点
  • 涉及C#
  • 的主要项目摘要
  • 实施
  • 的C#实施
  • 样本问题。

答案 4 :(得分:1)

这是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...
}