观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。观察者模式又称为发布/订阅(Publish/Subscribe)模式。
使用场景:
1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
下面用观察者模式实现一个简单的Demo:
一:创建 Subject 类
public class Subject
{
//声明一个订阅集合
public readonly List<Observer> observers = new List<Observer>();
private int state;
public int GetState()
{
return state;
}
public void SetState(int state)
{
this.state = state;
//更改完状态后立即通知所有的订阅者
NotifyAllObservers();
}
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void NotifyAllObservers()
{
foreach (var observer in observers)
{
observer.Update();
}
}
}
}
二:创建观察者抽象类
public abstract class Observer
{
protected Subject subject;
public abstract void Subscribe(Subject subject);
public abstract void Update();
}
三:创建观察者具体类,当目标对象改变状态时,依赖对象的状态随之改变
//订阅者1
public class DoubleObserver : Observer
{
public static DoubleObserver Instance { get; } = new DoubleObserver();
private DoubleObserver() { }
public override void Subscribe(Subject subject)
{
this.subject = subject;
this.subject.Attach(this);
}
public override void Update()
{
Console.WriteLine("双倍:"+ subject.GetState() * 2);
}
}
//订阅者2
class SquareObserver:Observer
{
public static SquareObserver Instance { get; } = new SquareObserver();
private SquareObserver() { }
public override void Subscribe(Subject subject)
{
this.subject = subject;
this.subject.Attach(this);
}
public override void Update()
{
Console.WriteLine("平方:"+Math.Pow(subject.GetState(), 2));
}
}
//订阅者3,4,5,6....
四:主方法执行
class ObserverPatternDemo
{
static void Main(string[] args)
{
Subject subject = new Subject();
//订阅消息
DoubleObserver.Instance.Subscribe(subject);
SqrtObserver.Instance.Subscribe(subject);
SquareObserver.Instance.Subscribe(subject);
//......
subject.SetState(16);
}
}
五:执行程序,输出结果:
双倍:32
平方根:4
平方:256