Doctrine中的DBAL具有访问者模式的实现。 有一个带有一些接受方法的接口。
interface Visitor
{
/**
* @return void
*/
public function acceptSchema(Schema $schema);
/**
* @return void
*/
public function acceptTable(Table $table);
public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint)
{
}
}
还有一些类似的类
class Schema
{
/**
* @return void
*/
public function visit(Visitor $visitor)
{
$visitor->acceptSchema($this);
if ($visitor instanceof NamespaceVisitor) {
foreach ($this->namespaces as $namespace) {
$visitor->acceptNamespace($namespace);
}
}
foreach ($this->_tables as $table) {
$table->visit($visitor);
}
foreach ($this->_sequences as $sequence) {
$sequence->visit($visitor);
}
}
}
为什么方法Schema::visit
的参数名为$visitor
?
“访问者”的所有定义都表明,确切的Visitor
应该具有方法visit
。因此,accept
方法应该在Visitable
的内部
那么Schema::visit($visitor)
是否存在一些命名问题? DBAL\Visitor
实际上是Visitable
吗?如果是这样,为什么Visitor::accept
不调用$ schema-> visit($ this)?
Dbal\Visitor
的某些实现看起来像
/**
* {@inheritdoc}
*/
public function acceptSequence(Sequence $sequence)
{
$this->sequences->attach($sequence);
}
是否有必要在$visitor->visit($this)
内调用Visitable::accept()
?