设计模式的意义在于:面向业务内容、业务数据结构和系统架构,高内聚低耦合、优雅的将平面逻辑立体化。
1 package designPattern;
2 import java.util.ArrayList;
3 import java.util.Collection;
4 import java.util.Iterator;
5 import java.util.List;
6 /**
7 * 访问者模式
8 * @author Administrator
9 */
10 public class C25_VisitorTest {
11
12 /**
13 * 表示一个作用于某对象结构中的各元素的操作。
14 * 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
15 * 适用于:
16 * 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
17 * 2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。
18 * Visitor使得你可以将相关的操作集中起来定义在一个类中。
19 * 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
20 * 3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
21 * 改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。
22 * 如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
23 */
24 @SuppressWarnings({ "rawtypes", "unchecked" })
25 public static void main(String[] args) {
26 Visitor visitor = new ConcreteVisitor();
27 StringElement se = new StringElement("abc");
28 se.accept(visitor);
29
30 FloatElement fe = new FloatElement(new Float(1.5));
31 fe.accept(visitor);
32 System.out.println("===========");
33 List result = new ArrayList();
34 result.add(new StringElement("abc"));
35 result.add(new StringElement("abc"));
36 result.add(new StringElement("abc"));
37 result.add(new FloatElement(new Float(1.5)));
38 result.add(new FloatElement(new Float(1.5)));
39 result.add(new FloatElement(new Float(1.5)));
40 visitor.visitCollection(result);
41 }
42 }
43 //visitor
44 interface Visitor {
45
46 public void visitString(StringElement stringE);
47
48 public void visitFloat(FloatElement floatE);
49
50 public void visitCollection(@SuppressWarnings("rawtypes") Collection collection);
51 }
52 //concreteVisitor
53 class ConcreteVisitor implements Visitor {
54
55 public void visitCollection(@SuppressWarnings("rawtypes") Collection collection) {
56 // TODO Auto-generated method stub
57 @SuppressWarnings("rawtypes")
58 Iterator iterator = collection.iterator();
59 while (iterator.hasNext()) {
60 Object o = iterator.next();
61 if (o instanceof Visitable) {
62 ((Visitable)o).accept(this);
63 }
64 }
65 }
66 public void visitFloat(FloatElement floatE) {
67 System.out.println(floatE.getFe());
68 }
69
70 public void visitString(StringElement stringE) {
71 System.out.println(stringE.getSe());
72 }
73 }
74 //element
75 interface Visitable {
76
77 public void accept(Visitor visitor);
78 }
79 //concreteElement
80 class FloatElement implements Visitable {
81
82 private Float fe;
83
84 public FloatElement(Float fe) {
85 this.fe = fe;
86 }
87
88 public Float getFe() {
89 return this.fe;
90 }
91
92 public void accept(Visitor visitor) {
93 visitor.visitFloat(this);
94 }
95 }
96 class StringElement implements Visitable {
97
98 private String se;
99
100 public StringElement(String se) {
101 this.se = se;
102 }
103
104 public String getSe() {
105 return this.se;
106 }
107
108 public void accept(Visitor visitor) {
109 visitor.visitString(this);
110 }
111 }