это простая реализация шаблона наблюдателя в 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...
}