定 义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
优 点:
1、观察者和被观察者之间是抽象耦合
2、建立一套出发机制
应用案例:
先来看看类图:
1.抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现
2.抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己
现在自己系统中的设计还未使用到这个观察者模式,但是其实是可以利用上的,例如在系统自动更新系统资源数据的时候,现在采用的是每间隔一段时间就自动更新一下资源,这样会造成有时候不需要更新也进行更新了,而且频繁更新会对网络、机器的依赖性更高,所以应该采用观察者设计模式,如果有资源的更新,立马通知资源更新模块来更新资源以及相关的数据,这样使得系统更加合理以及简洁,实现UML图如下:
再来看一个被多人监视的UML类图结构:
.NET中的Observer模式
利用事件和委托来实现Observer模式我认为更加的简单和优雅,也是一种更好的解决方案
效果及实现要点
1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
3.在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
总结
通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。