曹耘豪的博客

访问者模式

  1. 一个简单的示例

访问者模式定义了访问一个对象的方式,访问者(Visitor)通过被访问者提供的方法遍历被访问者

一个简单的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Visitor { void visit(Integer value); }

class A {
List<Integer> data;

public void foreach(Visitor visitor) {
for (Integer i: data) {
visitor.visit(i);
}
}
}

A a = new A();

class PrintVisitor implements Visitor {
public void visit(Integer value) {
System.out.println(value)
}
}

Visitor v = new PrintVisitor();
a.foreach(v)

对于Visitor只有一个方法,在Java8中,我们很容易使用函数式表达,省去了构造PrintVisitor类,可以看出此时非常像JDK的forEach

1
2
3
4
A a = new A();
a.foreach(item -> {
System.out.println(item);
})

即是是简单遍历,使用访问者模式也有其他好处,比如防止在遍历过程中修改元素

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Visitor { void visit(List<Integer> value); }

class A {
List<List<Integer>> data;

public void foreach(Visitor visitor) {
for (List<Integer> i: data) {
visitor.visit(Collections.unmodifiableList(i));
// or
visitor.visit(new ArrayList(i));
}
}
}
   /