原则DBAL访问者模式

时间:2019-03-10 13:41:54

标签: php design-patterns doctrine-orm

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()

0 个答案:

没有答案