Visitor パターン | デザインパターン
2022年10年1日
デザインパターン
Visitor
PHP
オライリージャパンによる Head First シリーズ デザインパターン(第2版)第14章 Visitor パターンを、 PHPで書き直してみようという試みです。
Visitor.php
namespace Visitor; interface Visitor { public function visitMenu(Menu $menu); public function visitMenuItem(MenuItem $menuItem); public function visitIngredients(Ingredients $ingredients); }
ConcreteVisitor.php
namespace Visitor; class ConcreteVisitor implements Visitor { public function visitMenu(Menu $menu) : void { echo $menu->getState(); echo "\n"; } public function visitMenuItem(MenuItem $menuItem) : void { echo $menuItem->getState(); echo "\n"; } public function visitIngredients(Ingredients $ingredients) : void { echo $ingredients->getState(); echo "\n"; } }
Element.php
namespace Visitor; interface Element { public function accept(Visitor $visitor); }
Menu.php
namespace Visitor; class Menu implements Element { public function accept(Visitor $visitor) : void { $visitor->visitMenu($this); } public function getState() : string { return 'Menu の栄養成分'; } }
MenuItem.php
namespace Visitor; class MenuItem implements Element { public function accept(Visitor $visitor) { $visitor->visitMenuItem($this); } public function getState() : string { return 'MenuItem の栄養成分'; } }
Ingredients.php
namespace Visitor; class Ingredients implements Element { public function accept(Visitor $visitor) { $visitor->visitIngredients($this); } public function getState() : string { return 'Ingredients の栄養成分'; } }
index.php
use Visitor\Menu; use Visitor\MenuItem; use Visitor\Ingredients; use Visitor\ConcreteVisitor; $menu = new Menu(); $menuItem = new MenuItem(); $ingredients = new Ingredients(); $concreteVisitor = new ConcreteVisitor(); $menu->accept($concreteVisitor); $menuItem->accept($concreteVisitor); $ingredients->accept($concreteVisitor);
出力結果
Menu の栄養成分 MenuItem の栄養成分 Ingredients の栄養成分