定义对象间的一种一对多的依赖关系,当目标发生变化时,它的所有观察者得到通知并自动更新。
主要组成:
Subject-目标
ConcreteSubject - 具体目标
Observer-观察者
ConcreteObserver-具体观察者
相关类:
using System;
using System.Collections.Generic;
namespace Observer
{
/// <summary>
/// 目标
/// </summary>
class Subject
{
public string SubjectSate { get; set; }
protected List<Observer> observers = new List<Observer>();
//注册
public void Attach(Observer observer)
{
observers.Add(observer);
}
//删除
public void Detach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach (var observer in observers)
{
observer.Update(this);
}
}
}
/// <summary>
/// 电视剧(具体目标)
/// </summary>
class TvPlay : Subject
{
public void TvUpdate()
{
Notify();
}
}
/// <summary>
/// 观察者
/// </summary>
abstract class Observer
{
public abstract void Update(Subject subject);
}
/// <summary>
/// 电视观众(具体观察者)
/// </summary>
class Televiewer : Observer
{
string ViewerName;
public Televiewer(string viewerName)
{
ViewerName = viewerName;
}
public override void Update(Subject subject)
{
Console.WriteLine("电视观众:{0},您追的电视剧更新到:{1}", ViewerName, subject.SubjectSate);
}
}
}
调用:
using System;
namespace Observer
{
class Program
{
static void Main(string[] args)
{
TvPlay tvPlay = new TvPlay();
tvPlay.SubjectSate = "49集";
Televiewer televiewerA = new Televiewer("A");
Televiewer televiewerB = new Televiewer("B");
//注册观察者
tvPlay.Attach(televiewerA);
tvPlay.Attach(televiewerB);
tvPlay.TvUpdate();
tvPlay.SubjectSate = "大结局";
//删除观察者
tvPlay.Detach(televiewerA);
tvPlay.TvUpdate();
Console.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》