首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP的设计模式-访问者模式与服务模式

PHP的设计模式-访问者模式与服务模式
EN

Stack Overflow用户
提问于 2015-01-14 16:59:47
回答 1查看 1.2K关注 0票数 2

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

访问者模式,

代码语言:javascript
复制
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);

佣人模式,

代码语言:javascript
复制
// 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();

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

EN

回答 1

Stack Overflow用户

发布于 2015-05-22 23:18:09

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27939046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档