访问者模式

定义

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

代码

抽象的访问者

1
2
3
4
public interface Visitor {
void visit(ConcreteElement1 element1);
void visit(ConcreteElement2 element2);
}

访问者的实现

1
2
3
4
5
6
7
8
9
10
11
public class VisitorImpl implements Visitor {
@Override
public void visit(ConcreteElement1 element1) {
element1.doSomething();
}

@Override
public void visit(ConcreteElement2 element2) {
element2.doSomething();
}
}

抽象元素

1
2
3
4
5
public abstract class Element {

public abstract void doSomething();
public abstract void accept(Visitor visitor);
}

具体元素

1
2
3
4
5
6
7
8
9
10
11
public class ConcreteElement1 extends Element {
@Override
public void doSomething() {
System.out.println("element 1");
}

@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}

1
2
3
4
5
6
7
8
9
10
11
public class ConcreteElement2 extends Element {
@Override
public void doSomething() {
System.out.println("element 2");
}

@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}

结构对象

1
2
3
4
5
6
7
8
9
10
11
public class ObjectStructure {

public static Element createEle(){
Random random = new Random();
if(random.nextInt() > 50){
return new ConcreteElement1();
}else{
return new ConcreteElement2();
}
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
public class ObjectStructureTest {

@Test
public void testVisitor(){
for (int i = 0; i < 10; i++) {
Element el = ObjectStructure.createEle();
el.accept(new VisitorImpl());
}
}

}