观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。
观察者模式涉及以下几个关键角色:
观察者接口(IObserver)
// 观察者接口
public interface IObserver
{
void Update(string message);
}
具体观察者(ConcreteObserver )
舍友是观察者,里面实现了更新方法:
// 具体观察者
public class ConcreteObserver : IObserver
{
private string _name;
private string _doSomething;
public ConcreteObserver(string name,string doSomething)
{
_name = name;
_doSomething = doSomething;
}
public void Update(string message)
{
Console.WriteLine($"{_name} 收到 {message},请求:{_doSomething}");
}
}
主题接口
// 主题接口
public interface ISubject
{
/**
* 增加订阅者
* @param observer
*/
void Attach(IObserver observer);
/**
* 删除订阅者
* @param observer
*/
void Detach(IObserver observer);
/**
* 通知订阅者更新消息
*/
void Notify(String message);
}
具体主题实现
// 具体主题
public class ConcreteSubject : ISubject
{
//储存订阅主题用户
private List<IObserver> _observers = new List<IObserver>();
//宿舍长下楼了
public void DownStairs()
{
Console.WriteLine("我要下楼了!");
Notify("宿舍长要下楼了");
}
public void Attach(IObserver observer)
{
_observers.Add(observer);
}
public void Detach(IObserver observer)
{
_observers.Remove(observer);
}
public void Notify(string message)
{
foreach (var observer in _observers)
{
observer.Update(message);
}
}
}
客户端调用
class Program
{
static void Main(string[] args)
{
//创建主题宿舍长的行踪
ConcreteSubject subject = new ConcreteSubject();
//创建订阅者舍友A
ConcreteObserver observer1 = new ConcreteObserver("李炎","帮我带饭");
//创建订阅者舍友B
ConcreteObserver observer2 = new ConcreteObserver("张力","帮我买瓶水");
//订阅宿舍长的行踪
subject.Attach(observer1);
subject.Attach(observer2);
//宿舍长下楼了
subject.DownStairs();
}
}
结果
我要下楼了!
李炎收到宿舍长要下楼了,请求帮忙带饭
张力收到宿舍长要下楼了,请求帮忙买瓶水
观察者模式通过定义一对多的依赖关系,使得对象之间的通信变得更加灵活和松耦合。通过接口和具体类的实现,可以实现动态的观察者管理和事件通知。