File tree Expand file tree Collapse file tree
src/designpattern/visitor Expand file tree Collapse file tree 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