观察者模式:定义了一种一对多的依赖关系,一个对象的行为引发多个对象的行为.让多个观察者绑定一个通知者。
当通知者的状态发生变化时候,会通知所有注册到通知者里面的观察者,使他们能够自动更新自己。
它是行为模式的一种,解决了具有一对多依赖关系的对象的重用问题。
以Socket通信为例,多个客户端绑定服务器IP和端口,注册到服务端中,那么服务器端与客户端就是一对多的关系。(观察者和通知者互相依赖)
通信,不是服务端和客户端直接通信,而是服务器端收到信号,进行转发(通知),客户端更新自己。和打电话是一个道理。
C#代码示例:
namespace 观察者模式
{
class Program
{
static void Main(string[] args)
{
//具体通知者(Server)
ConcreteNotifier notifier = new ConcreteNotifier();
//具体观察者(Client)注册到具体通知者(Server)中
ConcreteObserver client1 = new ConcreteObserver(notifier, "Client1");
ConcreteObserver client2 = new ConcreteObserver(notifier, "Client2");
notifier.Attach(client1,client2);
notifier.Notify();
Console.WriteLine("服务端(通知者)更新状态:");
notifier.State = "收到服务端消息...";
notifier.Notify();
}
}
//抽象观察者
public interface IObserver
{
void Notify();
}
//具体观察者(客户端):接收通知
public class ConcreteObserver : IObserver
{
private ConcreteNotifier notifier;
private string name;
/// <summary>
/// 具体观察者
/// </summary>
/// <param name="notifier">注册到具体通知者</param>
/// <param name="name">观察着名称</param>
public ConcreteObserver(ConcreteNotifier notifier, string name)
{
this.notifier = notifier;
this.name = name;
notifier.State = "默认";
}
public void Notify()
{
Console.WriteLine("观察者:{0} 状态是:{1}", name, this.notifier.State);
}
}
//抽象通知者
public interface INotifier
{
void Attach(params IObserver[] observer);
void Notify();
}
//实现通知者功能
public class Notifier : INotifier
{
private List<IObserver> observers = new List<IObserver>();
public void Attach(params IObserver[] observer)
{
foreach (var o in observer)
{
observers.Add(o);
}
}
//观察者通知每个通知者
public void Notify()
{
foreach (var observer in observers)
{
observer.Notify();
}
}
}
//具体通知者(服务端):发送通知
public class ConcreteNotifier : Notifier
{
public string State { get; set; } //状态
}
}
运行结果: