观察者模式
观察者模式又叫做发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
典型案例:游戏开发中,会有多种使用金币,展示金币的地方。当使用或获得金币后需要通知所有展示的界面刷新当前最新的金币信息。简单的观察者模式类结构图如下所示:
通过GoldSubject通知改变,让所有监听者自动刷新。
public abstract class Observer
{
public virtual void Update()
{
throw new System.NotImplementedException();
}
}
public abstract class Subject
{
private IList<Observer> observers=new List<Observer>();
public virtual void Attach(Observer observer)
{
observers.Add(observer);
}
public virtual void Detach(Observer observer)
{
observers.Remove(observer);
}
public virtual void Notify()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}
public class Skill : Observer
{
public override void Update()
{
Console.WriteLine("Skill 刷新");
}
}
public class Store : Observer
{
public override void Update()
{
Console.WriteLine("Store 刷新");
}
}
public class Package : Observer
{
public override void Update()
{
Console.WriteLine("Package 刷新");
}
}
static void Main(string[] args)
{
GoldSubject gold = new GoldSubject();
gold.Attach(new Skill());
gold.Attach(new Store());
gold.Attach(new Package());
gold.Notify();
}
执行结果:
Skill 刷新
Store 刷新
Package 刷新
如上述例子一样,实际开发中经常遇到一个对象改变时需要同时改变其他对象(一对多)的时候,我们在程序设计时就应该考虑采用观察者模式,将观察者抽象化,通知者并不关心具体的观察者,只要通知它们做出相应的响应即可。将观察者模式中的Update函数更改为事件委托,可以扩展功能,当一对象发生改变时,不同的观察者触发一系列不同的操作,这点在游戏开发中会经常用到。