Skip to content

Commit d966f13

Browse files
author
Liu Yuning
committed
add visitor DP
1 parent 7dd62b2 commit d966f13

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package designpattern.visitor;
2+
3+
/**
4+
* 定义一个accept操作,它以一个访问者为参数
5+
*
6+
* @author liu yuning
7+
*
8+
*/
9+
public abstract class Element {
10+
public abstract void accept(Visitor visitor);
11+
}
12+
13+
class ConcreteElementA extends Element {
14+
15+
@Override
16+
public void accept(Visitor visitor) {
17+
visitor.visitConcreteElementA(this);
18+
}
19+
20+
}
21+
22+
class ConcreteElementB extends Element {
23+
24+
@Override
25+
public void accept(Visitor visitor) {
26+
visitor.visitConcreteElementB(this);
27+
}
28+
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package designpattern.visitor;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* 提供一个高层的接口以允许访问者访问它的元素
8+
*
9+
* @author liu yuning
10+
*
11+
*/
12+
public class ObjectStructure {
13+
14+
private List<Element> elements = new ArrayList<Element>();
15+
16+
public void attach(Element element) {
17+
elements.add(element);
18+
}
19+
20+
public void detach(Element element) {
21+
elements.remove(element);
22+
}
23+
24+
public void accept(Visitor visitor) {
25+
for (Element element : elements) {
26+
element.accept(visitor);
27+
}
28+
}
29+
}
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package designpattern.visitor;
2+
3+
/**
4+
* 为该对象结构中ConcreteElement的每一个类声明一个Visit操作
5+
*
6+
* @author liu yuning
7+
*
8+
*/
9+
public abstract class Visitor {
10+
11+
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
12+
13+
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
14+
15+
}
16+
17+
class ConcreteVisitor1 extends Visitor {
18+
19+
@Override
20+
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
21+
System.out.println(concreteElementA.getClass().getSimpleName() + "被"
22+
+ this.getClass().getSimpleName() + "访问");
23+
}
24+
25+
@Override
26+
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
27+
System.out.println(concreteElementB.getClass().getSimpleName() + "被"
28+
+ this.getClass().getSimpleName() + "访问");
29+
}
30+
31+
}
32+
33+
class ConcreteVisitor2 extends Visitor {
34+
35+
@Override
36+
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
37+
System.out.println(concreteElementA.getClass().getSimpleName() + "被"
38+
+ this.getClass().getSimpleName() + "访问");
39+
}
40+
41+
@Override
42+
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
43+
System.out.println(concreteElementB.getClass().getSimpleName() + "被"
44+
+ this.getClass().getSimpleName() + "访问");
45+
}
46+
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package designpattern.visitor;
2+
3+
/**
4+
* 客户端
5+
*
6+
* @author liu yuning
7+
*
8+
*/
9+
public class VisitorClient {
10+
11+
public static void main(String[] args) {
12+
ObjectStructure o = new ObjectStructure();
13+
14+
o.attach(new ConcreteElementA());
15+
o.attach(new ConcreteElementB());
16+
17+
ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
18+
ConcreteVisitor2 visitor2 = new ConcreteVisitor2();
19+
20+
o.accept(visitor1);
21+
o.accept(visitor2);
22+
}
23+
}

0 commit comments

Comments
 (0)