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