observable.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # for MCV
  3. #
  4. Class Observable
  5. Observable instproc init {} {
  6.     $self instvar observerlist_ 
  7.     set observerlist_ ""
  8. }
  9. # Adds an observer to the set of observers for this object.
  10. # @param   o   an observer to be added.
  11. Observable instproc addObserver { o } {
  12.     $self instvar observerlist_
  13.     set cnt 0
  14.     set oid [$o id]
  15.     foreach ob $observerlist_ {
  16. set obid [$ob id]
  17. if { $oid == $obid } {
  18.     set cnt 1
  19.     break;
  20. }
  21.     }  
  22.     if { $cnt == 0 } {
  23.         lappend observerlist_ $o
  24.     }
  25. }
  26. # Deletes an observer from the set of observers of this object.
  27. # @param   o   the observer to be deleted.
  28. Observable instproc  deleteObserver { o } {
  29.     $self instvar observerlist_
  30.     set backlist_ ""
  31.     set oid [$o id]
  32.     foreach ob $observerlist_ {
  33.         set obid [$ob id]
  34.         if { $oid != $obid } {
  35.             lappend backlist_ $ob
  36.         } else {
  37. #     $o destroy
  38. #     leave the work to the application
  39.   }
  40.     }
  41.     
  42.     set observerlist_ $backlist_
  43. }
  44. # If this object has changed, as indicated by the
  45. # hasChanged method, then notify all of its observers
  46. # and then call the clearChanged method to indicate
  47. # that this object has no longer changed.
  48. # Each observer has its update method called with two
  49. # arguments: this observable object and the arg argument 
  50. Observable instproc notifyObservers { arg } {
  51.     $self instvar observerlist_
  52.     #??? Synchronization here before updating ???
  53.     foreach ob $observerlist_ {
  54. if ![ catch { $ob info class } ] {
  55.     $ob update $arg
  56.         }   
  57.     }
  58. }
  59. # Returns the number of observers of this object.
  60. Observable instproc countObservers {} {
  61.     $self instvar observerlist_
  62.     set size [llength $observerlist_]
  63.     return $size
  64. }