1.观察者模式又叫做发布-订阅模式。
2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
3.使用观察者模式的好处:维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
private static void Main(string[] args)
{
Boss boss = new Boss();
boss.Update += new StockObserver("股票哥", boss).CloseStockMarket;
boss.Update += new NBAObserver("NBA哥", boss).CloseNBADirectSeeding;
boss.SubjectState = "老板回来了。。。";
boss.Notify();
} /// <summary>
/// 通知者接口
/// </summary>
public interface ISubject
{
void Notify(); string SubjectState { get; set; }
} public delegate void EventHandler(); public class Boss : ISubject
{
public event EventHandler Update; public void Notify()
{
if (Update != null)
{
Update();
}
} public string SubjectState { get; set; }
} /// <summary>
/// 前台秘书类
/// </summary>
public class Secretary : ISubject
{
public event EventHandler Update; public void Notify()
{
if (Update != null)
{
Update();
}
} public string SubjectState { get; set; }
} /// <summary>
/// 看股票的同事
/// </summary>
public class StockObserver
{
private string name;
private ISubject subject; public StockObserver(string name, ISubject subject)
{
this.name = name;
this.subject = subject;
} public void CloseStockMarket()
{
Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", subject.SubjectState, name);
}
} /// <summary>
/// 看NBA的同事
/// </summary>
public class NBAObserver
{
private string name;
private ISubject subject; public NBAObserver(string name, ISubject subject)
{
this.name = name;
this.subject = subject;
} public void CloseNBADirectSeeding()
{
Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", subject.SubjectState, name);
}
}