
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
///
/// 观察者接口
///
public interface IObserver
{
///
/// 观察到事件 调用函数
///
void Update();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
///
/// 主题
///
public class Subject
{
// 观察者列表
private List<IObserver> observers = new List<IObserver>();
///
/// 添加观察者
///
///
public void AddObserver(IObserver observer)
{
// 添加订阅者
Console.WriteLine("----添加订阅者---");
this.observers.Add(observer);
}
///
/// 删除观察者
///
///
public void DeleteObserver(IObserver observer)
{
// 删除订阅者
this.observers.Remove(observer);
}
// 通知所有观察者
public void NotifyObservers()
{
foreach (IObserver item in observers)
{
item.Update();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
///
/// 老板动作主题 发布者
///
public class BossConcreateSubject : Subject
{
public void DoSomething()
{
Console.WriteLine("......老板做些事情..........");
Console.WriteLine("......老板视察工作..........");
// 发布事件 通知订阅者
this.NotifyObservers();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
public class ConcreateObserverA : IObserver
{
public void Update()
{
Console.WriteLine("观察者A -- 接受到事件");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
public class ConcreateObserverB : IObserver
{
public void Update()
{
Console.WriteLine("观察者B -- 接受到事件");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Observer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("---------------------观察者模式-----------------------");
// 创建主题
BossConcreateSubject bossConcreateSubject = new BossConcreateSubject();
// 创建观察者
ConcreateObserverA observerA = new ConcreateObserverA();
ConcreateObserverB observerB = new ConcreateObserverB();
Console.WriteLine("---------------------主题添加观察者-----------------------");
bossConcreateSubject.AddObserver(observerA);
bossConcreateSubject.AddObserver(observerB);
Console.WriteLine("---------------------主题触发事件-----------------------");
bossConcreateSubject.DoSomething();
Console.ReadLine();
}
}
}

优点:
1、降低目标(主题)与观察者之间的耦合关系、主题与观察者建立了触发机制。
2、观察者与被观察者都是 抽象耦合的。
缺点:
1、观察者与观察目标有循环依赖关系、触发它们之间的循环调用、可能会导致系统崩溃
2、因为触发是循环调用,如果观察者过多会花费很长时间。