18_观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。
观察者模式有四个主要角色:
-
主题(Subject):定义了观察者的注册、删除和通知方法。主题可以是具体类或接口。
-
具体主题(Concrete Subject):继承或实现了主题,并实现了注册、删除和通知方法。具体主题内部维护了一个观察者列表,并在状态发生改变时通知观察者。
-
观察者(Observer):定义了更新方法,用于接收主题的通知并进行相应的处理。观察者可以是具体类或接口。
-
具体观察者(Concrete Observer):继承或实现了观察者,并实现了更新方法。具体观察者在接收到主题的通知后,执行相应的业务逻辑。
观察者模式的工作原理如下:
-
主题维护了一个观察者列表,可以在需要的时候注册、删除和通知观察者。
-
具体主题实现了主题接口,并在需要的时候调用观察者的更新方法。
-
观察者实现了观察者接口,并在接收到主题的通知后执行相应的更新操作。
观察者模式的优点包括:
-
解耦了主题和观察者之间的关系,使得它们可以独立地变化。
-
可以实现一对多的依赖关系,主题的状态改变时可以同时通知多个观察者。
-
可以方便地增加或删除观察者,扩展新的观察者类。
观察者模式适用于以下场景:
-
当一个对象的改变需要同时影响其他对象,并且不希望对象之间紧密耦合时,可以使用观察者模式。
-
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,可以使用观察者模式。
总结而言,观察者模式通过定义对象之间的一对多依赖关系,实现了当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。它提供了一种松耦合的方式来处理对象之间的关系,并支持一对多的依赖关系。
案例场景:
猫大叫一声,老鼠赶紧逃跑,主人醒来开灯看看怎么回事?
猫就是主题角色(被观察者),老鼠和主人就是观察者角色。
Subject
/// <summary> /// 被观察者的抽象基类 /// </summary> public abstract class Subject { private IList<Observer> _observers = new List<Observer>();//当前主题对象的观察者集合 /// <summary> /// 添加观察者 /// </summary> /// <param name="observer"></param> public void Attach(Observer observer) { _observers.Add(observer); } /// <summary> /// 移除观察者 /// </summary> /// <param name="observer"></param> public void Detach(Observer observer) { _observers.Remove(observer); } public void Nofity() { Console.WriteLine("猫突然大叫一声...喵..."); foreach (var item in _observers) { item.Update(); } } }
Observer
public abstract class Observer { public abstract void Update(); }
Concrete Subject
public class Cat : Subject { }
Concrete Observer
public class Mouse : Observer { public override void Update() { Console.WriteLine("老鼠:快跑,被老猫发现了..."); } }
public class Master : Observer { public override void Update() { Console.WriteLine("主人:我家的猫又叫了,开灯看看怎么回事?"); } }
调用
internal class Client { public void Start() { Cat cat = new Cat(); cat.Attach(new Mouse()); cat.Attach(new Master()); cat.Nofity(); } }
static void Main(string[] args) { new Client().Start(); Console.ReadKey(); }