php实现设计模式之 访问者模式
<?php /** * 访问者模式 * 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 * 行为类模式 */ /** 抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。 元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。 结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。 */ 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(); ?>
UML类图如下