forked from john-bai/DesignPatterns
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVisitor.java
More file actions
155 lines (118 loc) · 2.92 KB
/
Copy pathVisitor.java
File metadata and controls
155 lines (118 loc) · 2.92 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package designpatterns;
import java.util.List;
import java.util.ListIterator;
/**
*
* @author jtherrell
*/
abstract class Equipment {
private String name;
private double price;
public Equipment(String name, double price) {
this.name = name;
this.price = price;
}
public String name() { return name; }
public double price() { return price; }
abstract public void accept(EquipmentVisitor visitor);
}
abstract class CompositeEquipment extends Equipment {
protected List<Equipment> parts;
public CompositeEquipment(String name, double price, List<Equipment> parts) {
super(name, price);
this.parts = parts;
}
abstract public void accept(EquipmentVisitor visitor);
}
class FloppyDisk extends Equipment {
public FloppyDisk(String name, double price) {
super(name, price);
}
public void accept(EquipmentVisitor visitor) {
visitor.visitFloppyDisk(this);
}
}
class Card extends Equipment{
public Card(String name, double price) {
super(name, price);
}
public void accept(EquipmentVisitor visitor) {
visitor.visitCard(this);
}
}
class Bus extends CompositeEquipment{
public Bus(String name, double price, List<Equipment> parts) {
super(name, price, parts);
}
@Override
public void accept(EquipmentVisitor visitor) {
ListIterator<Equipment> iter = parts.listIterator();
Equipment e;
while(iter.hasNext()) {
e = iter.next();
e.accept(visitor);
}
visitor.visitBus(this);
}
}
class Chassis extends CompositeEquipment {
public Chassis(String name, double price, List<Equipment> parts) {
super(name, price, parts);
}
@Override
public void accept(EquipmentVisitor visitor) {
ListIterator<Equipment> iter = parts.listIterator();
Equipment e;
while(iter.hasNext()) {
e = iter.next();
e.accept(visitor);
}
visitor.visitChassis(this);
}
}
interface EquipmentVisitor{
public void visitFloppyDisk(FloppyDisk floppy);
public void visitCard(Card card);
public void visitChassis(Chassis chassis);
public void visitBus(Bus bus);
}
class PricingVisitor implements EquipmentVisitor {
private double total;
public double total() {
return total;
}
public void visitFloppyDisk(FloppyDisk floppy) {
total += floppy.price();
}
public void visitCard(Card card) {
total += card.price();
}
public void visitChassis(Chassis chassis) {
total += chassis.price();
}
public void visitBus(Bus bus) {
total += bus.price();
}
}
class InventoryVisitor implements EquipmentVisitor {
private List<Equipment> inventory;
public InventoryVisitor(List<Equipment> inventory) {
this.inventory = inventory;
}
public void visitFloppyDisk(FloppyDisk floppy) {
inventory.add(floppy);
}
public void visitCard(Card card) {
inventory.add(card);
}
public void visitChassis(Chassis chassis) {
inventory.add(chassis);
}
public void visitBus(Bus bus) {
inventory.add(bus);
}
}