オブザーバー パターン

Observer Pattern

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
      

だてめがね
...
©️ ponpocopy

とある企業で社内SEをしています。 自身の学びが誰かの為になれば、という想いで日々ブログを更新中。 PHP(CakePHP・Laravel・FuelPHP), Pyhotn(Django・Flask), C#(ASP.NET、Unity) が好きです。