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