访问者模式

通过访问者模式,可以通过访问者类进行对固定数据的不同方式的访问。增加访问方式只要增加访问类而不需要更改数据对象。

Class Diagram

Implementation

数据接口

1
2
3
public interface Element {
void accept(Visitor visitor);
}

具体数据类型

1
2
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");
}
}

访问者接口

1
2
3
4
5

abstract class Visitor {
public abstract void visit(ElementA elemA);
public abstract void visit(ElementB elemB);
}

具体访问者

1
2
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");
}
}

对外提供访问

1
2
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);
});
}
}

测试

1
2
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