通过访问者模式,可以通过访问者类进行对固定数据的不同方式的访问。增加访问方式只要增加访问类而不需要更改数据对象。
Class Diagram
 
Implementation
数据接口
| 12
 3
 
 | public interface Element {void accept(Visitor visitor);
 }
 
 | 
具体数据类型
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | public class ElementA implements Element {@Override
 public void accept(Visitor visitor) {
 visitor.visit(this);
 }
 
 public void operationA(){
 System.out.println("Element A operation");
 }
 }
 
 public class ElementB implements Element {
 @Override
 public void accept(Visitor visitor) {
 visitor.visit(this);
 }
 
 public void operationB(){
 System.out.println("Element B operation");
 }
 }
 
 | 
访问者接口
| 12
 3
 4
 5
 
 | abstract class Visitor {
 public abstract void visit(ElementA elemA);
 public abstract void visit(ElementB elemB);
 }
 
 | 
具体访问者
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | public class OneVisitor extends Visitor {@Override
 public void visit(ElementA elemA) {
 System.out.println("访问者 OneVisitor 访问 ElementA");
 }
 
 @Override
 public void visit(ElementB elemB) {
 System.out.println("访问者 OneVisitor 访问 ElementB");
 }
 }
 
 public class TwoVisitor extends Visitor {
 @Override
 public void visit(ElementA elemA) {
 System.out.println("访问者 TwoVisitor 访问 ElementA");
 }
 
 @Override
 public void visit(ElementB elemB) {
 System.out.println("访问者 TwoVisitor 访问 ElementB");
 }
 }
 
 | 
对外提供访问
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | public class ObjectStructure {
 private List<Element> elementList = new ArrayList<Element>();
 
 public void attach(Element element){
 elementList.add(element);
 }
 
 public void detach(Element element){
 elementList.remove(element);
 }
 
 public void accept(Visitor visitor){
 elementList.forEach((element)->{
 element.accept(visitor);
 });
 }
 }
 
 | 
测试
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | public class VisitorTest {
 @Test
 public void test(){
 ObjectStructure objectStructure = new ObjectStructure();
 objectStructure.attach(new ElementA());
 objectStructure.attach(new ElementB());
 
 objectStructure.accept(new OneVisitor());
 objectStructure.accept(new TwoVisitor());
 }
 }
 
 | 
Exmaple
- javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
- javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor
Reflence