Całościowy kod
interface Observer{
public function update(Observable $observer);
}
abstract class Observable {
private $observers = array();
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
foreach($this->observers as $okey => $oval) {
if ($oval == $observer) {
unset($this->observers[$okey]);
}
}
}
public function notify() {
foreach($this->observers as $obs)
$obs->update($this);
}
}
class SmsNotification implements Observer{
public function __construct() {
}
public function update(Observable $observable) {
$this->sendSms($observable->getNews());
}
private function sendSms($news)
{
echo "wysylam sms z nowa wiadomoscia $news<br>";
}
}
class EmailNotification implements Observer{
public function __construct() {
}
public function update(Observable $observable) {
$this->sendEmail($observable->getNews());
}
private function sendEmail($news)
{
echo "wysylam email z nowa wiadomoscia $news<br>";
}
}
class NewsModel implements Observer{
public function __construct() {
}
public function update(Observable $observable) {
$this->addToDb($observable->getNews());
}
private function addToDb($news)
{
echo 'dodaje newsy do bazy danych<br>';
}
}
class NewsDownloader extends Observable {
private $news;
function __construct() {
}
function updateNews($news) {
$this->news = $news;
$this->notify();
}
function getNews() {
return $this->news;
}
}
$newsDownloader = new NewsDownloader();
$smsNotification = new SmsNotification();
$emailNotification = new EmailNotification();
$dbModel = new NewsModel();
$newsDownloader->attach($dbModel);
$newsDownloader->attach($emailNotification);
$newsDownloader->attach($smsNotification);
$newsDownloader->updateNews('Zamknieto baze w USA');
$newsDownloader->updateNews('Polska jest mocarstwem');
$newsDownloader->detach($smsNotification);
$newsDownloader->updateNews('Reprezentacja Polski w pilce noznej wygrywa Mistrzostwa Swiata');
Strony: 1 2 3
Ten sam przykład z wykorzystaniem SPL
https://gist.github.com/anonymous/0309420667a901a4b7ce
Miałem napisać właśnie przykład z wykorzystaniem SPL, dzięki za gist-a.