访问者模式

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

参考文章 https://wenku.baidu.com/view/b4c78b4702768e9951e738fb.html

你可能感兴趣的:(访问者模式)