interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState { get; set; }
}
class Boss:Subject
{
private IList<Observer> observers = new List<Observer>();
private string action;
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach(Observer observer in observers)
{
observer.Update();
}
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
abstract class Observer
{
protected string name;
protected Subject sub;
public Observer(string name,Subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
class StockObserver : Observer
{
public StockObserver(string name, Subject sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine($"{sub.SubjectState}{name}关闭股票行情,继续工作!");
}
}
class NBAObserver : Observer
{
public NBAObserver(string name, Subject sub) : base(name, sub)
{
}
public override void Update()
{
Console.WriteLine($"{sub.SubjectState}{name}关闭NBA,开始工作!");
}
}
class Program
{
static void Main(string[] args)
{
Boss boss=new Boss();
StockObserver t1 = new StockObserver("张三", boss);
NBAObserver t2 = new NBAObserver("李四", boss);
boss.SubjectState = "嘤嘤嘤,老板回来了!";
boss.Attach(t1);
boss.Attach(t2);
boss.Notify();
boss.Detach(t1);
boss.Notify();
}
}
- 将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
- 当一个对象的改变需要同时改变其他对象的时候,应该考虑使用观察者模式。
- 当一个抽象模型有两个方面,其中一方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。
- 观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。