Observer パターン | デザインパターン
2022年9年20日
デザインパターン
Observer
PHP
オライリージャパンによる Head First シリーズ デザインパターン(第2版)第2章 Observer パターンを、PHPで書き直してみようという試みです。
Subject.php
namespace Observer; interface Subject { public function resisterObserver(Observer $o) : void; public function removeObserver(Observer $o) : void; public function notifyObserver() : void; }
WeatherData.php
namespace Observer; class WeatherData implements Subject { private array $observers; private float $temperature; private float $humidity; private float $pressure; public function __construct() { $this->observers = []; } public function resisterObserver($o) : void { $this->observers[get_class($o)] = $o; } public function removeObserver($o) : void { unset($this->observers[get_class($o)]); } public function notifyObserver() : void { foreach ($this->observers as $observer) { $observer->update($this->temperature,$this->humidity,$this->pressure); } } public function measurementChanged() : void { self::notifyObserver(); } public function setMeasurement(float $temperature, float $humidity, float $pressure) : void { $this->temperature = $temperature; $this->humidity = $humidity; $this->pressure = $pressure; self::measurementChanged(); } }
Observer.php
namespace Observer; interface Observer { public function update(float $temperature, float $humidity, float $pressure) : void; }
DisplayElement.php
namespace Observer; interface DisplayElement { public function display() : void; }
CurrentConditionsDisplay.php
namespace Observer; class CurrentConditionsDisplay implements Observer, DisplayElement { private WeatherData $weatherData; private float $temperature; private float $humidity; private float $pressure; public function __construct(WeatherData $weatherData) { $this->weatherData = $weatherData; $weatherData->resisterObserver($this); } public function update(float $temperature, float $humidity, float $pressure) : void { $this->temperature = $temperature; $this->humidity = $humidity; $this->display(); } public function display() : void { echo '現在の気象情報 : ' . '温度' . $this->temperature . '度(華氏)' . ' 湿度 : ' . $this->humidity; echo "\n"; } }
index.php
use Observer\WeatherData; use Observer\CurrentConditionsDisplay; $weatherData = new WeatherData(); $currentConditionsDisplay = new CurrentConditionsDisplay($weatherData); $weatherData->setMeasurement(80,65,30.4); $weatherData->setMeasurement(82,70,29.2); $weatherData->setMeasurement(78,90,29.2);
出力結果
現在の気象情報 : 温度80度(華氏) 湿度 : 65 現在の気象情報 : 温度82度(華氏) 湿度 : 70 現在の気象情報 : 温度78度(華氏) 湿度 : 90