观察者模式(Observer Pattern)又被称为发布-订阅(Publish/Subscribe)模式。
该模式描述了对象间一对多的依赖关系,当一个对象状态发生改变时,其依赖对象都会得到通知并自动更新。
发生改变的对象为观察目标,被通知并自行更新的对象为观察者。
为什么使用观察者模式?为了将观察目标与观察者解耦。
当使用观察者模式后,观察者只需要知道观察目标发生了改变,而不需要知道究竟发生了什么改变;同理,观察目标只需要发出通知,让所有观察者自行做出响应。
游戏中的事件系统就很适合用此设计模式。
观察者模式的实现(C#)- Observer:观察者接口
////// 观察者接口 /// public interface Observer { void OnNotify(); }
- Subject:观察目标抽象类
////// 观察目标抽象类 /// public abstract class Subject { // 观察者列表 protected Listobservers; // 添加观察者 public abstract void Add(Observer observer); // 删除观察者 public abstract void Remove(Observer observer); // 通知所有观察者 public abstract void NotifyAllObservers(); }
- ConcreteSubject:观察目标具体实现
////// 观察目标具体实现 /// public class ConcreteSubject : Subject { public ConcreteSubject() { observers = new List(); } public override void Add(Observer observer) { if (!observers.Contains(observer)) { observers.Add(observer); } } public override void Remove(Observer observer) { if (observers.Contains(observer)) { observers.Remove(observer); } } public override void NotifyAllObservers() { foreach (Observer o in observers) { o.OnNotify(); } } }
- ConcreteObserver:观察者实现,一个观察对象可以对应多个观察者
////// 观察者实例1 /// public class ConcreteObserver1 : Observer { public void OnNotify() { Console.WriteLine("OnNotify ConcreteObserver1"); } } ////// 观察者实例2 /// public class ConcreteObserver2 : Observer { public void OnNotify() { Console.WriteLine("OnNotify ConcreteObserver2"); } }
测试代码
public class Test
{
public static void TestFunc()
{
// 实例化观察目标
Subject subject = new ConcreteSubject();
//实例化观察者
Observer observer1 = new ConcreteObserver1();
Observer observer2 = new ConcreteObserver2();
//向观察目标的观察者列表中添加对象
subject.Add(observer1);
subject.Add(observer2);
//通知全体观察者
subject.NotifyAllObservers();
}
}
输出:
OnNotify ConcreteObserver1 OnNotify ConcreteObserver2



