getName(); } } class User implements Role { /** * @var string */ protected $name; /** * @param string $name */ public function __construct($name) { $this->name = (string) $name; } /** * @param RoleVisitor $visitor * @return void */ public function accept(RoleVisitor $visitor) { $visitor->visit($this); } /** * @return string */ public function getName() { return "User " . $this->name; } } class Group implements Role { /** * @var string */ protected $name; /** * @param string $name */ public function __construct($name) { $this->name = (string) $name; } /** * @param RoleVisitor $visitor * @return void */ public function accept(RoleVisitor $visitor) { $visitor->visit($this); } /** * @return string */ public function getName() { return "Group: " . $this->name; } } $user = new User("Dominik"); $group = new Group("Administrators"); $printer = new RolePrintVisitor(); $printer->visit($user); $printer->visit($group);