在.NET体系结构中,有很多设计模式。我想知道观察者模式的含义及其实现方式
答案 0 :(得分:6)
Observer模式在C#中作为事件非常具体化。
答案 1 :(得分:5)
维基百科最好地总结了它:
观察者模式(观察者的一个子集) 发布/订阅模式)是一个 软件设计模式中的一个 对象,称为主题,维护 他的家属名单,叫做 观察者,并通知他们 任何状态变化的自动 通常通过打电话给他们之一 方法。它主要用于 实现分布式事件处理 系统
观察者(有时称为publish-subscribe
模式)最适用于GUI界面,以更新GUI对象的更改状态,例如所有其他对象都可以更新自身(例如,调整窗口大小,然后是所有gui对象,例如按钮可以根据窗口的大小重新对齐。这通常是通过引入EventListeners
(这是一个观察者模式)来完成的。
要实现,您可以从以下任一位置查看教程:
希望这有帮助。
答案 2 :(得分:1)
答案 3 :(得分:1)
答案 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...
}