访问者模式把数据结构和做用于结构上的操做解耦合,使得操做集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。由于访问者模式使得算法操做增长变得容易。若系统数据结构对象易于变化,常常有新的数据对象增长进来,则不适合使用访问者模式。访问者模式的优势是增长操做很容易,由于增长操做意味着增长新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增长新的数据结构很困难。—— From 百科算法
简单来讲,访问者模式就是一种分离对象数据结构与行为的方法,经过这种分离,可达到为一个被访问者动态添加新的操做而无需作其它的修改的效果。简单关系图:数据结构
来看看原码:一个Visitor类,存放要访问的对象数据结构和算法
public interface Visitor { public void visit(Subject sub); }
public class MyVisitor implements Visitor { @Override public void visit(Subject sub) { System.out.println("visit the subject:"+sub.getSubject()); } }
Subject类,accept方法,接受将要访问它的对象,getSubject()获取将要被访问的属性ide
public interface Subject { public void accept(Visitor visitor); public String getSubject(); }
public class MySubject implements Subject { @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override public String getSubject() { return "love"; } }
测试:测试
public class Test { public static void main(String[] args) { Visitor visitor = new MyVisitor(); Subject sub = new MySubject(); sub.accept(visitor); } }
输出:visit the subject:lovethis
该模式适用场景:若是咱们想为一个现有的类增长新功能,不得不考虑几个事情:一、新功能会不会与现有功能出现兼容性问题?二、之后会不会再须要添加?三、若是类不容许修改代码怎么办?面对这些问题,最好的解决方法就是使用访问者模式,访问者模式适用于数据结构相对稳定的系统,把数据结构和算法解耦,spa