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