模式定义
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
下图是该模式的类图:
一个生动的例子
Element接口:
public interface ComputerPart {
public void accept(ComputerPartVisitor computerPartVisitor);
}
Element实体类:
class Keyboard implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
Element实体类:
class Monitor implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
System.out.println(this.getClass());
}
}
Element实体类:
class Mouse implements ComputerPart {
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Visitor接口:
public interface ComputerPartVisitor {
void visit(Mouse mouse);
void visit(Keyboard keyboard);
void visit(Monitor monitor);
}
Visitor实体类:
class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(Mouse mouse) {
System.out.println("Displaying Mouse.");
}
@Override
public void visit(Keyboard keyboard) {
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(Monitor monitor) {
System.out.println("Displaying Monitor.");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ObjectStructure类:
public class Computer {
private ComputerPart[] parts;
public Computer() {
parts = new ComputerPart[] { new Mouse(), new Keyboard(), new Monitor() };
}
public void show(ComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts.accept(computerPartVisitor);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
测试类/客户端类:
public class VisitorTest {
public static void main(String[] args) {
Computer computer = new Computer();
computer.show(new ComputerPartDisplayVisitor());
}
}
1
2
3
4
5
6
7
这是一个彩蛋
parts.accept(computerPartVisitor);这句话如果写成computerPartVisitor.visit(parts);,那么ComputerPart类的accept方法就都不用写了,直接这样调用就好了。
你可以改改试试,首先computerPartVisitor.visit(parts);是错的,因为computerPartVisitor的visit函数中没有参数是ComputerPart类型的,这是静态分配,这样的话你就必须要把parts强转成一种具体类型,这样是肯定不可能的。
那为什么parts.accept(computerPartVisitor);这样就行了呢?首先根据动态分配会调用具体的accept方法,然后accept方法中调用computerPartVisitor.visit(this);,这个时候this代表的就是实际类型
---------------------
转载,仅作分享,侵删
作者:EagleLi1
原文:https://blog.csdn.net/qq_21687635/article/details/85244401
|
|