设计模式利剑16-观察者模式

时间:2021-05-21 22:00:35

定      义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

优      点:

               1、观察者和被观察者之间是抽象耦合

               2、建立一套出发机制

应用案例:

             先来看看类图:

 

设计模式利剑16-观察者模式

         1.抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现
         2.抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
         3.具体主题角色(Watched):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
         4.具体观察者角色(Watcher):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己 
         现在自己系统中的设计还未使用到这个观察者模式,但是其实是可以利用上的,例如在系统自动更新系统资源数据的时候,现在采用的是每间隔一段时间就自动更新一下资源,这样会造成有时候不需要更新也进行更新了,而且频繁更新会对网络、机器的依赖性更高,所以应该采用观察者设计模式,如果有资源的更新,立马通知资源更新模块来更新资源以及相关的数据,这样使得系统更加合理以及简洁,实现UML图如下:

 

 

设计模式利剑16-观察者模式

        再来看一个被多人监视的UML类图结构:

设计模式利剑16-观察者模式

        .NET中的Observer模式

        利用事件和委托来实现Observer模式我认为更加的简单和优雅,也是一种更好的解决方案

       

     效果及实现要点

      1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。

      2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。

      3.在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。

     总结

     通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。

 

设计模式利剑16-观察者模式