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 の栄養成分