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)