访问者模式

2017-05-29  本文已影响5人  散装咖啡
/**
       访问者模式
       表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的
前提下定义作用于这些元素的新操作
*/
    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<br/>";
        }
        
        public function visitCroncreteElementB($element)
        {
            echo get_class($element)." visit 1B<br/>";
        }
    }
    
    class ConcreteVisitor2 extends Visitor
    {
        public function visitCroncreteElementA($element)
        {
            echo get_class($element)." visit 2A<br/>";
        }
        
        public function visitCroncreteElementB($element)
        {
            echo get_class($element)." visit 2B<br/>";
        }
    }
    
    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

上一篇下一篇

猜你喜欢

热点阅读