目录

代码示例

<?php

/**
 * Description of VisitorDemo
 * 访问者模式
 * @author jm
 */
class VisitorDemo
{
    //put your code here
    public static function main()
    {
        $visitor = new MyVisitor();
        $subject = new MySubject();
        $subject->accept($visitor);
    }
}

interface Vistor{
    public function visit($subject);
}

class MyVisitor implements Vistor{
    public function visit($subject)
    {
        print_r("访问处理:".$subject->getValue());
    }
}


interface Subject{
    public function accept($visitor);
    public function getValue();
}

class MySubject implements Subject{
    /**
     * 
     * @param MyVisitor $visitor
     */
    public function accept($visitor)
    {
        $visitor->visit($this);//由访问者协助处理,不再本业务类中处理
    }
    public function getValue()
    {
        return "tsingchan";
    }
}
VisitorDemo::main();

输出

访问处理:tsingchan

场景

该模式适用场景:

如果我们想为一个现有的类增加新功能,不得不考虑几个事情:

  • 1、新功能会不会与现有功能出现兼容性问题?
  • 2、以后会不会再需要添加?
  • 3、如果类不允许修改代码怎么办?

面对这些问题,最好的解决方法就是使用访问者模式,访问者模式适用于数据结构相对稳定的系统,把数据结构和算法解耦。

小结

访问者模式,表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式适合用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

访问者的目的是要把处理从数据结构分离出来。这样系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。

增加新的操作容易,因为增加新的操作就意味着增加一个新的访问者。访问者将有关行为集中到一个访问者对象中。

访问者模式使增加新的数据结构变得困难了。


本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @TsingChan