- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVisitorTest.java
More file actions
Latest commit
104 lines (80 loc) · 2.41 KB
/
Copy pathVisitorTest.java
File metadata and controls
104 lines (80 loc) · 2.41 KB
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
packageJavaPatternDemos;
importjava.util.ArrayList;
/**
* 访问者模式
*
* 将对不同对象的操作封装到访问者类中,避免对被访问对象类造成污染
* 但是原对象需要向访问者暴露较多的元素,因为修改操作都交给了访问者
*
* 适用与被访问对象的变动是少的(不会在后来新增啥的)
* 同时访问者也可以设置多个不同的角色,权限等,这一点的话也有点像 观察者的主动模式
*
* 观察者是被动的接受通知, 操作在被观察者中,当然也可以写在观察者中,这样就暴露信息了。
* 而访问者是主动的访问, 操作在访问者中
*
*
*/
publicclassVisitorTest {
publicstaticvoidmain(String[] args) {
MyVisitorone_visitor = newVisitorimpl();
MyVisitorgold_visitor = newGoldVisitor();
AllVisitedall_land = newAllVisited();
all_land.accept(one_visitor);
all_land.accept(gold_visitor);
}
}
interfaceMyVisitor{
// 所有的实际操作应该在 访问者中实现,避免对被访问者的类进行修改
voidvisit(EastVisitedeast);
voidvisit(WestVisitedwest);
}
interfaceVisited{
voidaccept(MyVisitorvisitor);
}
classVisitorimplimplementsMyVisitor{
@Override
publicvoidvisit(EastVisitedeast) {
System.out.println("visit East ");
}
@Override
publicvoidvisit(WestVisitedwest) {
System.out.println("visit west ");
}
}
classGoldVisitorimplementsMyVisitor{
@Override
publicvoidvisit(EastVisitedeast) {
System.out.println("Badass visited east");
}
@Override
publicvoidvisit(WestVisitedwest) {
System.out.println("Badass visited west");
}
}
classEastVisitedimplementsVisited{
@Override
publicvoidaccept(MyVisitorvisitor) {
visitor.visit(this);
}
}
classWestVisitedimplementsVisited{
@Override
publicvoidaccept(MyVisitorvisitor) {
visitor.visit(this);
}
}
classAllVisitedimplementsVisited{
privateArrayList<Visited> allComponents;
publicAllVisited(){
allComponents = newArrayList<Visited>(10);
allComponents.add(newEastVisited());
allComponents.add(newWestVisited());
}
@Override
publicvoidaccept(MyVisitorvisitor) {
for(Visitedeach : allComponents)
{
each.accept(visitor);
}
}
}