Defines a one-to-many dependency between objects so that when the status of an object changes, all objects dependent on it are notified and automatically refreshed to conveniently create objects that view the status of the target object, and provide non-coupling with the core object.
The code is as follows:
/**
* Observer Mode
*
* Define a one-to-many dependency between objects so that when the status of an object changes, all objects dependent on it will be notified and automatically refreshed.
* You can easily create an object to view the status of the target object, and provide a specified function that is not coupled with the core object.
* Plug-in system
*/
Class Observerable
{
Private $ _ observers = array ();
Public function registerObserver ($ observer)
{
$ This-> _ observers [] = $ observer;
}
Public function removeObserver ($ observer)
{
$ Key = array_search ($ observer, $ this-> _ observers );
If (! ($ Key = false ))
{
Unset ($ this-> _ observers [$ key]);
}
}
Public function notifyObservers ()
{
Foreach ($ this-> _ observers as $ observer)
{
If ($ observer instanceof Observer) $ observer-> update ($ this );
}
}
}
Interface Observer
{
Public function update ($ observer );
}
Interface DisplayElement
{
Public function display ();
}
// -- Instance class definition
Class NewsObserverable extends Observerable
{
Private $ _ sports_news;
Public function setSportsNews ($ data)
{
$ This-> _ sports_news = $ data;
$ This-> policyobservers ();
}
Public function getSportsNews ()
{
Return $ this-> _ sports_news;
}
Private $ _ local_news;
Public function setLocalNews ($ data)
{
$ This-> _ local_news = $ data;
$ This-> policyobservers ();
}
Public function getLocalNews ()
{
Return $ this-> _ local_news;
}
}
Class SportsNews implements Observer, DisplayElement
{
Private $ _ data = null;
Public function update ($ observer)
{
If ($ this-> _ data! = $ Observer-> getSportsNews ())
{
$ This-> _ data = $ observer-> getSportsNews ();
$ This-> display ();
}
}
Public function display ()
{
Echo $ this-> _ data. date ("Y-m-d H: I: s ")."
";
}
}
Class LocalNews implements Observer, DisplayElement
{
Private $ _ data = null;
Public function update ($ observer)
{
If ($ this-> _ data! = $ Observer-> getLocalNews ())
{
$ This-> _ data = $ observer-> getLocalNews ();
$ This-> display ();
}
}
Public function display ()
{
Echo $ this-> _ data. date ("Y-m-d H: I: s ")."
";
}
}
// -- Instantiate ---
$ ObjObserver = new NewsObserverable ();
$ Local = new LocalNews ();
$ Sports = new SportsNews ();
$ ObjObserver-> registerObserver ($ local );
$ ObjObserver-> registerObserver ($ sports );
$ ObjObserver-> setSportsNews ("sports news 1 ");
$ ObjObserver-> setLocalNews ("local news 1 ");
$ ObjObserver-> removeObserver ($ sports );
$ ObjObserver-> setLocalNews ("local news 2 ");
$ ObjObserver-> setSportsNews ("sports news 2 ");
$ ObjObserver-> removeObserver ($ local );
$ ObjObserver-> setLocalNews ("local news 3 ");