ビジター パターン

Visitor Pattern

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

だてめがね
...
©️ ponpocopy

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