观察者模式(Observer Pattern)
当一个对象被修改时,则会自动通知依赖它的对象。
使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。
观察者模式属于行为型模式。
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
优点:
1、观察者和被观察者是抽象耦合的。
2、建立一套触发机制。
缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
观察者抽象接口:
/// <summary>
/// 观察者抽象接口
/// </summary>
public interface IObserver
{
void Response();
}
被观察者抽象接口:
/// <summary>
/// 被观察者抽象接口
/// </summary>
public interface ISubject
{
void AddList(IObserver observer);
}
具体观察者:老鼠
/// <summary>
/// 具体观察者
/// </summary>
public class Mouse : IObserver
{
public void Response()
{
Debug.Log("逃跑!!!");
}
public void ToObserve(ISubject subject)
{
subject.AddList(this);
}
}
具体被观察者:猫
/// <summary>
/// 具体被观察者
/// </summary>
public class Cat : ISubject
{
List<IObserver> Observers = new List<IObserver>();//追捕列表
public void AddList(IObserver observer)
{
if (!Observers.Contains(observer)) Observers.Add(observer);
}
public void Chase()
{
Debug.Log("开始追捕");
foreach (var item in Observers)
{
item.Response();
}
}
}
运行测试:
void Start()
{
Mouse mouse1 = new Mouse();//观察者:老鼠
Mouse mouse2 = new Mouse();
Mouse mouse3 = new Mouse();
Cat cat = new Cat();//被观察的猫
mouse1.ToObserve(cat);//添加观察对象
mouse2.ToObserve(cat);
mouse3.ToObserve(cat);
cat.Chase();//猫开始追捕
}
结果: