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

来源:互联网 发布:java三大框架教学视频 编辑:程序博客网 时间:2024/04/26 07:05
 

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

优      点:

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

               2、建立一套出发机制

应用案例:

             先来看看类图:

 

image

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

 

 

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

image

        .NET中的Observer模式

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

       

     效果及实现要点

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

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

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

     总结

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

 

view plaincopy to clipboardprint?
  1. Public Interface IObservable   
  2.     '''    
  3.     ''' <param name="anObserver"></param>   
  4.     Sub Register(ByVal key As String, ByVal anObserver As IObserver)  
  5.     '''    
  6.     ''' <param name="key"></param>   
  7.     Sub UnRegister(ByVal key As String)  
  8. End Interface ' IObservable    
  9. Public Interface IObserver   
  10.     '''    
  11.     ''' <param name="anObject"></param>   
  12.     Sub Notify(ByVal anObject As Object)  
  13. End Interface ' IObserver    
  14. Public Interface IHanfeizi  
  15.     Sub haveBreackfast()  
  16.     Sub haveFun()  
  17. End Interface ' IHanfeizi   
  18.   
  19. Public Class Hanfeizi  
  20.     Implements IHanfeizi, IObservable   
  21.     Private observerContainer As Hashtable  = new Hashtable()  
  22.     Public Sub haveBreackfast() Implements IHanfeizi.haveBreackfast  
  23.         Console.WriteLine("韩非子吃饭")  
  24.     End Sub  
  25.     '''    
  26.     ''' <param name="anObserver"></param>   
  27.     Public Sub Register(ByVal key As String, ByVal anObserver As IObserver) Implements IObservable.Register  
  28.         observerContainer.Add(key, anObserver)  
  29.     End Sub  
  30.     Public Sub haveFun() Implements IHanfeizi.haveFun  
  31.         Console.WriteLine("韩非子弄笑话了")  
  32.     End Sub  
  33.     '''    
  34.     ''' <param name="key"></param>   
  35.     Public Sub UnRegister(ByVal key As String) Implements IObservable.UnRegister  
  36.         observerContainer.Remove(key)  
  37.     End Sub  
  38.     '''    
  39.     ''' <param name="message"></param>   
  40.     Public Sub NotifyObservers(ByVal message As String)  
  41.         Dim _observer As IObserver  
  42.         For Each _observer In observerContainer.Values  
  43.             _observer.Notify(message)  
  44.         Next  
  45.     End Sub  
  46. End Class ' Hanfeizi   
  47. Public Class Lisi  
  48.     Implements IObserver  
  49.     '''    
  50.     ''' <param name="anObject"></param>   
  51.     Public Sub Notify(ByVal anObject As Object) Implements IObserver .Notify  
  52.         Console.WriteLine("李斯观察到韩非子正在:" & anObject.ToString)  
  53.         Console.WriteLine("李斯向老板汇报情况")  
  54.     End Sub  
  55. End Class ' Lisi   
  56. Public Class LiuSi  
  57.     Implements IObserver   
  58.     '''    
  59.     ''' <param name="anObject"></param>   
  60.     Public Sub Notify(ByVal anObject As Object) Implements IObserver .Notify  
  61.         Console.WriteLine("刘斯观察到韩非子正在:" & anObject.ToString)  
  62.         Console.WriteLine("刘斯高兴不得了")  
  63.     End Sub  
  64. End Class ' LiuSi   
  65. Public Class WangSi  
  66.     Implements IObserver   
  67.     '''    
  68.     ''' <param name="anObject"></param>   
  69.     Public Sub Notify(ByVal anObject As Object) Implements IObserver .Notify  
  70.         Console.WriteLine("王斯观察到韩非子正在:" & anObject.ToString)  
  71.         Console.WriteLine("王斯气急败坏")  
  72.     End Sub  
  73. End Class ' WangSi   
  74. Module Client  
  75.     Sub Main()  
  76.         Dim _hanfeizi As Hanfeizi = New Hanfeizi()  
  77.         Dim _lisi As IObserver = New Lisi  
  78.         Dim _liusi As IObserver = New LiuSi  
  79.         Dim _wangsi As IObserver = New WangSi  
  80.         _hanfeizi.Register("lisi", _lisi)  
  81.         _hanfeizi.Register("liusi", _liusi)  
  82.         _hanfeizi.Register("wangsi", _wangsi)  
  83.         _hanfeizi.haveBreackfast()  
  84.         _hanfeizi.NotifyObservers("韩非子吃饭了")  
  85.         _hanfeizi.haveFun()  
  86.         _hanfeizi.NotifyObservers("韩非子弄笑话了")  
  87.         Console.Read()  
  88.     End Sub  
  89. End Module