学习php设计模式 php实现访问者模式(Visitor)(2)

1、如果所浏览的结构对象是线性的,使用迭代模式而不是访问者模式也是可以的
2、访问者模式浏览合成模式的一些结构对象
以上两点来自《Java与模式》一书

五、Visitor模式PHP示例

<?php interface Visitor { public function visitConcreteElementA(ConcreteElementA $elementA); public function visitConcreteElementB(concreteElementB $elementB); } interface Element { public function accept(Visitor $visitor); } /** * 具体的访问者1 */ class ConcreteVisitor1 implements Visitor { public function visitConcreteElementA(ConcreteElementA $elementA) { echo $elementA->getName() . " visitd by ConcerteVisitor1 <br />"; } public function visitConcreteElementB(ConcreteElementB $elementB) { echo $elementB->getName() . " visited by ConcerteVisitor1 <br />"; } } /** * 具体的访问者2 */ class ConcreteVisitor2 implements Visitor { public function visitConcreteElementA(ConcreteElementA $elementA) { echo $elementA->getName() . " visitd by ConcerteVisitor2 <br />"; } public function visitConcreteElementB(ConcreteElementB $elementB) { echo $elementB->getName() . " visited by ConcerteVisitor2 <br />"; } } /** * 具体元素A */ class ConcreteElementA implements Element { private $_name; public function __construct($name) { $this->_name = $name; } public function getName() { return $this->_name; } /** * 接受访问者调用它针对该元素的新方法 * @param Visitor $visitor */ public function accept(Visitor $visitor) { $visitor->visitConcreteElementA($this); } } /** * 具体元素B */ class ConcreteElementB implements Element { private $_name; public function __construct($name) { $this->_name = $name; } public function getName() { return $this->_name; } /** * 接受访问者调用它针对该元素的新方法 * @param Visitor $visitor */ public function accept(Visitor $visitor) { $visitor->visitConcreteElementB($this); } } /** * 对象结构 即元素的集合 */ class ObjectStructure { private $_collection; public function __construct() { $this->_collection = array(); } public function attach(Element $element) { return array_push($this->_collection, $element); } public function detach(Element $element) { $index = array_search($element, $this->_collection); if ($index !== FALSE) { unset($this->_collection[$index]); } return $index; } public function accept(Visitor $visitor) { foreach ($this->_collection as $element) { $element->accept($visitor); } } } class Client { /** * Main program. */ public static function main() { $elementA = new ConcreteElementA("ElementA"); $elementB = new ConcreteElementB("ElementB"); $elementA2 = new ConcreteElementB("ElementA2"); $visitor1 = new ConcreteVisitor1(); $visitor2 = new ConcreteVisitor2(); $os = new ObjectStructure(); $os->attach($elementA); $os->attach($elementB); $os->attach($elementA2); $os->detach($elementA); $os->accept($visitor1); $os->accept($visitor2); } } Client::main(); ?>

以上就是使用php实现访问者模式的代码,还有一些关于访问者模式的概念区分,希望对大家的学习有所帮助。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/821ace850b7e4a4b5d822eb35ef5b627.html