观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。。

何时能用到它?

此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况被发起后,所以观察者的代码段 都将被执行。

而对于一个发邮件的功能来说,所有订阅了此功能的模块,只要系统到某个时间点,发邮件的事件就是被触发,此时,所有订阅了此功能的代码模块都会被执行,这种场合,我们见到的不少,如很多网站的新闻订阅,优惠订阅等等,都可以用到它。对于底层开发人员来说,你的CURD操作,如果希望在操作出错后,动态记录日志,事实上,也可以使用这个模式来实现,只要在WEB层或者BLL层订阅一下记录日志的事件即可。

观察者模式的结构图

说说设计模式~观察者模式(Observer)_观察者模式

观察者模式实现说明

SubjectBase:被观察者的基类,它包括了添加观察者,删除观察者,触发观察者的功能

Subject:其中一个被观察者

IObserver:被观察者对象接口,所以被观察者都要实现它,其中SubjectBase也会接收一个IObserver对象,用来触发所有观察者

Observer1:观察者1

Observer2:观察者2

观察者模式的C#实现

#region 观察者模式
/// <summary>
/// 被观察者基类
/// </summary>
public abstract class SubjectBase
{
private ArrayList _observers = new ArrayList();
public void Add(IObserver o)
{
_observers.Add(o);
}
public void Remove(IObserver o)
{
_observers.Remove(o);
}
public void Notify()
{
foreach (IObserver o in _observers)
{
o.Notify();
}
}
}
/// <summary>
/// 被观察者(委托)
/// </summary>
public class Subject : SubjectBase
{

}

/// <summary>
/// 观察者实现接口(事件)
/// </summary>
public interface IObserver
{
void Notify();
}
/// <summary>
/// 观察者1
/// </summary>
public class Observer1 : IObserver
{
public void Notify()
{
Console.WriteLine("观察者1");
}
}
/// <summary>
/// 观察者2
/// </summary>
public class Observer2 : IObserver
{
public void Notify()
{
Console.WriteLine("观察者2");
}
}
#endregion

测试代码

new Subject();
subject.Add(new Observer1());
subject.Add(new Observer2());
subject.Notify();

结果如图

说说设计模式~观察者模式(Observer)_发邮件_02

作者:仓储大叔,张占岭,
荣誉:微软MVP