访问者模式定义了访问一个对象的方式,访问者(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)); visitor.visit(new ArrayList(i)); } } }
|