Commit d966f13 Liu Yuning
committed
1 parent 7dd62b2 commit d966f13 Copy full SHA for d966f13
File tree 4 files changed +128
-0
lines changed
src/designpattern/visitor
4 files changed +128
-0
lines changed Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments