2015-01-14 2 views
1

я нахожу эти две модели похожи (и большинство других моделей поведения)дизайн шаблоны для PHP - шаблон посетитель против служащего шаблон

шаблон посетитель,

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

Можете ли вы рассказать о различиях между ними? (если пример шаблона слуха неверен?)

ответ

2

Фактически, слуга проще, чем шаблон посетителя. Диаграмма классов аналогична. В шаблоне посетителя объект Visitor полагается на посещенные элементы, но обслуживаемый объект нет.

+0

'посещенные элементы' - вы имеете в виду« ConcreteVisitable »в моем примере выше? – laukok

+1

Да, это потому, что объект-посетитель должен что-то сделать с помощью Visitable Object! – tian

+1

И объект-слуга нет? это не '' public function moveTo (Servable $ Servable, $ arg) 'равно как' public function visit (Visitable $ Visitable) '? – laukok