Skip to content

Instantly share code, notes, and snippets.

@rilwanfit
Last active March 29, 2018 13:51
Show Gist options
  • Save rilwanfit/cb842534c1d739fd5959ab71e530daf4 to your computer and use it in GitHub Desktop.
Save rilwanfit/cb842534c1d739fd5959ab71e530daf4 to your computer and use it in GitHub Desktop.
[Design Pattern] (Observer) - Newspaper and Reader
$newspaper = new Newspaper('Newyork Times');
$allen = new Reader('Allen');
$jim = new Reader('Jim');
$linda = new Reader('Linda');
//add reader
$newspaper->attach($allen);
$newspaper->attach($jim);
$newspaper->attach($linda);
//remove reader
//$newspaper->detach($linda);
//set break outs
$newspaper->breakOutNews('USA break down!');
//=====output======
//Allen is reading breakout news USA break down! (Newyork Times)
//Jim is reading breakout news USA break down! (Newyork Times)
class Newspaper implements SplSubject
{
private $name;
private $observers = [];
private $content;
public function __construct($name)
{
$this->name = $name;
}
public function attach(SplObserver $observer)
{
$this->observers[] = $observer;
}
public function detach(SplObserver $observer)
{
$key = array_search($observer, $this->observers, true);
if ($key) {
unset($this->observers[$key]);
}
}
public function notify()
{
foreach ($this->observers as $value) {
$value->update($this);
}
}
public function breakOutNews($content)
{
$this->content = $content;
$this->notify();
}
public function getContent()
{
return $this->content . " ({$this->name})";
}
}
class Reader implements SplObserver
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function update(SplSubject $subject)
{
echo $this->name . ' is reading breakout news <b>' . $subject->getContent() . '</b>' . PHP_EOL;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment