<?php <BR>/** <BR>* 访问者模式 <BR>* <BR>* 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 <BR>* <BR>*/ <BR>abstract class Visitor <BR>{ <BR>abstract public function visitCroncreteElementA($element); <BR>abstract public function visitCroncreteElementB($element); <BR>} <BR>class ConcreteVisitor1 extends Visitor <BR>{ <BR>public function visitCroncreteElementA($element) <BR>{ <BR>echo get_class($element)." visit 1A<br />"; <BR>} <BR>public function visitCroncreteElementB($element) <BR>{ <BR>echo get_class($element)." visit 1B<br />"; <BR>} <BR>} <BR>class ConcreteVisitor2 extends Visitor <BR>{ <BR>public function visitCroncreteElementA($element) <BR>{ <BR>echo get_class($element)." visit 2A<br />"; <BR>} <BR>public function visitCroncreteElementB($element) <BR>{ <BR>echo get_class($element)." visit 2B<br />"; <BR>} <BR>} <BR>abstract class Element <BR>{ <BR>abstract public function accept($visitor); <BR>} <BR>class ConcreteElementA extends Element <BR>{ <BR>public function accept($visitor) <BR>{ <BR>$visitor->visitCroncreteElementA($this); <BR>} <BR>} <BR>class ConcreteElementB extends Element <BR>{ <BR>public function accept($visitor) <BR>{ <BR>$visitor->visitCroncreteElementB($this); <BR>} <BR>} <BR>class ObjectStructure <BR>{ <BR>private $_elements = array(); <BR>public function attach($element) <BR>{ <BR>$this->_elements[] = $element; <BR>} <BR>public function detach($element) <BR>{ <BR>if($key = array_search($element,$this->_elements) !== false) unset($this->_elements[$key]); <BR>} <BR>public function accept($visitor) <BR>{ <BR>foreach($this->_elements as $element) <BR>{ <BR>$element->accept($visitor); <BR>} <BR>} <BR>} <BR>// <BR>$objOS = new ObjectStructure(); <BR>$objOS->attach(new ConcreteElementA()<strong>)本文来(源gaodai#ma#com搞@@代~&码*网2</strong><pre>搞代gaodaima码
);
$objOS->attach(new ConcreteElementB());
$objCV1 = new ConcreteVisitor1();
$objCV2 = new ConcreteVisitor2();
$objOS->accept($objCV1);
$objOS->accept($objCV2);