php - PHP 的设计模式 - 访问者模式与仆人模式

标签 php design-patterns visitor-pattern

我发现这两种模式很相似(以及大多数其他行为模式)

访客模式,

interface Visitor 
{
    public function visit(Visitable $Visitable);
} 
interface Visitable 
{
    public function accept(Visitor $Vsitor);
}
class ConcreteVisitable implements Visitable
{
    public $items = array();

    public function addItem($item)
    {
        $this->items[] = $item;
    }

    public function accept(Visitor $Vsitor)
    {
        $Vsitor->visit($this);
    }
}
class ConcreteVisitor implements Visitor 
{
    protected $info;

    public function visit(Visitable $Visitable)
    {
        echo "Object: ", get_class($Visitable), " <br/>";
        $items = get_object_vars($Visitable)['items'];

        foreach ($items as $index => $value) {
            echo $index . ": ", $value, " <br/>";
        }
    }
}
// Usage example
$ConcreteVisitable = new ConcreteVisitable();
$ConcreteVisitor = new ConcreteVisitor();
$ConcreteVisitable->addItem('item 1');
$ConcreteVisitable->addItem('item 2');
$ConcreteVisitable->addItem('item 3');
$ConcreteVisitable->accept($ConcreteVisitor);

仆人模式,

// Servant.
interface Servant
{
    //  
}

// Servable. AKA Boss/ Master/ Authority
interface Servable
{
    //
}

// Concrete Servable.
class ConcreteServable implements Servable
{
    private $position;

    public function setPosition($position)
    {
        $this->position = $position . '<br/>';
    }

    public function getPosition()
    {
        return $this->position;
    }
}

// Concrete Servant.
class ConcreteServant implements Servant
{
    // Method, which will move Servable implementing class to position where.
    public function moveTo(Servable $Servable, $arg) 
    {
        // Do some other stuff to ensure it moves smoothly and nicely, this is
        // the place to offer the functionality.
        $Servable->setPosition($arg);
    }
}

$ConcreteServable = new ConcreteServable();
$ConcreteServant = new ConcreteServant();

$ConcreteServant->moveTo($ConcreteServable, 10);
echo $ConcreteServable->getPosition();

$ConcreteServant->moveTo($ConcreteServable, 20);
echo $ConcreteServable->getPosition();

你能说出它们之间的区别吗? (除非仆人模式示例不正确??)

最佳答案

事实上,仆人模式比访客模式更简单。类图也类似。 在访问者模式中,访问者对象依赖于访问过的元素,但服务对象则不依赖。

关于php - PHP 的设计模式 - 访问者模式与仆人模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27939046/

相关文章:

java - 如何为编辑器正确使用具有不同形状的访问者模式

javascript - 将用户输入永久发布到网页

php - 如何关闭从 DOM 插入 MySQL 的 PHP 循环

php - 您如何创建一个包含环绕常用代码的代码块的函数?

c# - session 或 webAPI 中的任何替代方案

php - 最近的访客脚本

javascript - 使用重写规则后未加载 CSS 、 js 、 jpg png 帮助我

php - 如何保护 PHP 中的管理面板?

php - JavaScript/Ajax/PHP 的设计模式/工作流 - 应用程序

c# - 在 C# 中使用带有泛型的访问者模式