复制代码代码如下:
/**
* オブザーバー パターン
*
* オブジェクト間の 1 対多の依存関係を定義します。これにより、オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます
* ターゲット オブジェクトのステータスを表示するオブジェクトを簡単に作成し、コア オブジェクトから切り離された特定の機能を提供する機能
* プラグイン システム
*/
クラス 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 NoticeObservers()
{
foreach($this->_observers as $observer)
{
if($observer instanceofオブザーバー) $observer->update($this);
}
}
}
インターフェース オブザーバー
{
public function update($observer);
}
interface DisplayElement
{
public function display();
}
// -- 例定義
class NewsObserverable extends Observerable
{
private $_sports_news;
パブリック関数 setSportsNews($data)
{
$this->_sports_news = $data;
$this->notifyObservers();
}
public function getSportsNews()
{
return $this->_sports_news;
}
プライベート $_local_news;
パブリック関数 setLocalNews($data)
{
$this->_local_news = $data;
$this->notifyObservers();
}
public function getLocalNews()
{
return $this->_local_news;
}
}
クラス SportsNews 実装 Observer,DisplayElement
{
private $_data = null;
パブリック関数 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 実装 Observer,DisplayElement
{
private $_data = null;
パブリック関数 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")."
";
}
}
// -- 例化 ---
$objObserver = new NewsObserverable();
$local = new LocalNews();
$sports = new SportsNews();
$objObserver->registerObserver($local);
$objObserver->registerObserver($sports);
$objObserver->setSportsNews("スポーツ ニュース 1 ");
$objObserver->setLocalNews("ローカル ニュース 1 ");
$objObserver->removeObserver($sports);
$objObserver->setLocalNews("ローカル ニュース 2 ");
$objObserver->setSportsNews("スポーツ ニュース 2 ");
$objObserver->removeObserver($local);
$objObserver->setLocalNews("ローカル ニュース 3 ");