メディテーター パターン

Meditator Pattern

Meditator パターン | デザインパターン

2022年9年25日
デザインパターン Meditator PHP
...

オライリージャパンによる Head First シリーズ デザインパターン(第2版)第14章 Meditator パターンを、 PHPで書き直してみようという試みです。

Colleague.php

 
namespace Meditator;

abstract class Colleague {

  abstract public function onEvent(Meditator $meditator) : void;

}
 

Alarm.php

 
namespace Meditator;

class Alarm extends Colleague {

  public function onEvent(Meditator $meditator) : void {

    $meditator->doEvent('alarm');

  }

  public function doAlarm() : void {

    echo 'doAlarm()';
    echo "\n";

  }

}
 

CoffeePot.php

 
namespace Meditator;

class CoffeePot extends Colleague {

  public function onEvent(Meditator $meditator) : void {

    $meditator->doEvent('coffeePot');

  }

  public function doCoffeePot() : void {

    echo 'doCoffeePot()';
    echo "\n";

  }

}
 

Calendar.php

 
namespace Meditator;

class Calendar extends Colleague {

  public function onEvent(Meditator $meditator) : void {

    $meditator->doEvent('calendar');

  }

  public function doCalendar() : void {

    echo 'doCalendar()';
    echo "\n";

  }

}
 

Sprinkler.php

 
namespace Meditator;

class Sprinkler extends Colleague {

  public function onEvent(Meditator $meditator) : void {

    $meditator->doEvent('sprinkler');

  }

  public function doSprinkler() : void {

    echo 'doSprinler()';
    echo "\n";

  }

}
 

Meditator.php

 
namespace Meditator;

abstract class Meditator {

  abstract public function doEvent(string $eventType) : void;

}
 

ConcreteMeditator.php

 
namespace Meditator;

class ConcreteMeditator extends Meditator {

  private Alarm $alarm;
  private CoffeePot $coffeePot;
  private Calendar $calendar;
  private Sprinkler $sprinkler;

  public function __construct(Alarm $alarm, CoffeePot $coffeePot, Calendar $calendar, Sprinkler $sprinkler) {

    $this->alarm = $alarm;
    $this->coffeePot = $coffeePot;
    $this->calendar = $calendar;
    $this->sprinkler = $sprinkler;

  }

  public function doEvent(string $eventType) : void {

    switch ($eventType) {

      case "alarm":
        self::doAlarmEvent();
        break;

      case "coffeePot":
        self::doCoffeePotEvent();
        break;

      case "calendar":
        self::doCalenderEvent();
        break;

      case 'sprinkler':
        self::doSprinklerEvent();
        break;

    }

  }

  public function doAlarmEvent() : void {

    $this->alarm->doAlarm();

  }

  public function doCoffeePotEvent() : void {

    $this->coffeePot->doCoffeePot();

  }

  public function doCalenderEvent() : void {

    $this->calendar->doCalendar();

  }

  public function doSprinklerEvent() : void {

    $this->sprinkler->doSprinkler();

  }

}
 

index.php

 
use Meditator\Alarm;
use Meditator\CoffeePot;
use Meditator\Calendar;
use Meditator\Sprinkler;
use Meditator\ConcreteMeditator;

$alarm = new Alarm();
$coffeePot = new CoffeePot();
$calendar = new Calendar();
$sprinkler = new Sprinkler();
$meditator = new ConcreteMeditator($alarm, $coffeePot, $calendar, $sprinkler);

$alarm->onEvent($meditator);
$coffeePot->onEvent($meditator);
$calendar->onEvent($meditator);
$sprinkler->onEvent($meditator);
 

出力結果

 
  doAlarm()
  doCoffeePot()
  doCalendar()
  doSprinler()
 

だてめがね
...
©️ ponpocopy

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