Code: Select all
DeclareModule  SUBSCRIBER
  Structure Subscriber
    ID.i
    Name.s
  EndStructure
  Declare Update(*ToWhom.SUBSCRIBER::Subscriber, News.s)
EndDeclareModule
Module SUBSCRIBER
  Procedure Update(*ToWhom.SUBSCRIBER::Subscriber, News.s)
    MessageRequester("NEWS Broadcast to "+ *ToWhom\Name, News, #PB_MessageRequester_Info)
  EndProcedure
EndModule
DeclareModule PUBLISHER
  
  Structure Publisher
    News.s
    List Subscribers.SUBSCRIBER::Subscriber()
  EndStructure
  
  Declare AddObserver(*Observer.SUBSCRIBER::Subscriber, *Publisher.PUBLISHER::Publisher)
  Declare RemoveObsererver(*Observer.SUBSCRIBER::Subscriber, *Publisher.PUBLISHER::Publisher)
  
  Declare NotifyObservers(*Publisher.PUBLISHER::Publisher)
  Declare SetNews(News.s, *Publisher.PUBLISHER::Publisher)
  Declare UpdateDailyNews(*Publisher.PUBLISHER::Publisher)
  
EndDeclareModule
Module PUBLISHER
  Procedure AddObserver(*Observer.SUBSCRIBER::Subscriber, *Publisher.PUBLISHER::Publisher)
    AddElement(*Publisher\Subscribers())
    *Publisher\Subscribers()\ID = *Observer\ID
    *Publisher\Subscribers()\Name = *Observer\Name
  EndProcedure
  
  Procedure RemoveObsererver(*Observer.SUBSCRIBER::Subscriber, *Publisher.PUBLISHER::Publisher)
    Protected X
    For X = ListSize(*Publisher\Subscribers())-1 To 0 Step -1
      SelectElement(*Publisher\Subscribers(), X)
      If *Publisher\Subscribers()\ID = *Observer\ID And
         *Publisher\Subscribers()\Name = *Observer\Name
        DeleteElement(*Publisher\Subscribers())
        Break
      EndIf
    Next
  EndProcedure
  
  Procedure NotifyObservers(*Publisher.PUBLISHER::Publisher)
    Protected X
    For X = ListSize(*Publisher\Subscribers())-1 To 0 Step -1
      SelectElement(*Publisher\Subscribers(), X)
      SUBSCRIBER::Update(*Publisher\Subscribers(), *Publisher\News)
    Next
  EndProcedure
  
  Procedure SetNews(News.s, *Publisher.PUBLISHER::Publisher)
    *Publisher\News = News
  EndProcedure
  
  Procedure UpdateDailyNews(*Publisher.PUBLISHER::Publisher)
    PUBLISHER::NotifyObservers(*Publisher)
  EndProcedure
  
EndModule
MSNBC.PUBLISHER::Publisher
George.SUBSCRIBER::Subscriber
George\ID = 1
George\Name ="George"
PUBLISHER::AddObserver(@George, @MSNBC)
Martha.SUBSCRIBER::Subscriber
Martha\ID = 1
Martha\Name ="Martha"
PUBLISHER::AddObserver(@Martha, @MSNBC)
PUBLISHER::SetNews("Breaking NEWS...Nothing Happened!", @MSNBC)
PUBLISHER::UpdateDailyNews(@MSNBC)








 
  

