-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy path5_20.rb
149 lines (126 loc) · 3.04 KB
/
5_20.rb
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
class Mechanic
# def prepare_trip(trip)
# trip.bicycles.each {|bicycle|
# prepare_bicycle(bicycle)}
# end
# ...
def prepare_bicycles(bicycles)
bicycles.each {|bicycle| prepare_bicycle(bicycle)}
end
def prepare_bicycle(bicycle)
#...
puts "Mechanic prepare_bicycle #{bicycle}"
end
end
class TripCoordinator
# def prepare_trip(trip)
# buy_food(trip.customers)
# end
# ...
def buy_food(customers)
# ...
puts "TripCoordinator buy_food"
end
end
class Driver
# def prepare_trip(trip)
# vehicle = trip.vehicle
# gas_up(vehicle)
# fill_water_tank(vehicle)
# end
# ...
def gas_up(vehicle)
#...
puts "Driver gas_up"
end
def fill_water_tank(vehicle)
#...
puts "Driver fill_water_tank"
end
end
class Bicycle
end
class Customer
end
class Vehicle
end
###############################
# Initial example
###############################
class Trip
attr_reader :bicycles, :customers, :vehicle
def initialize(bicycles, customers, vehicle)
@bicycles = bicycles
@customers = customers
@vehicle = vehicle
end
def prepare(preparers)
preparers.each {|preparer|
case preparer
when Mechanic
preparer.prepare_bicycles(bicycles)
when TripCoordinator
preparer.buy_food(customers)
when Driver
preparer.gas_up(vehicle)
preparer.fill_water_tank(vehicle)
end
}
end
# ...
end
puts "\nInitial example:"
trip = Trip.new(
[Bicycle.new, Bicycle.new, Bicycle.new],
[Customer.new, Customer.new],
Vehicle.new )
preparers = [TripCoordinator.new, Driver.new, Mechanic.new]
trip.prepare(preparers)
###############################
# kind_of? example
###############################
class Trip
def prepare(preparers)
preparers.each {|preparer|
if preparer.kind_of?(Mechanic)
preparer.prepare_bicycles(bicycles)
elsif preparer.kind_of?(TripCoordinator)
preparer.buy_food(customers)
elsif preparer.kind_of?(Driver)
preparer.gas_up(vehicle)
preparer.fill_water_tank(vehicle)
end
}
end
end
puts "\nkind_of? example:"
trip = Trip.new(
[Bicycle.new, Bicycle.new, Bicycle.new],
[Customer.new, Customer.new],
Vehicle.new )
preparers = [TripCoordinator.new, Driver.new, Mechanic.new]
trip.prepare(preparers)
###############################
# respond_to? example
###############################
class Trip
def prepare(preparers)
preparers.each {|preparer|
if preparer.respond_to?(:prepare_bicycles)
preparer.prepare_bicycles(bicycles)
elsif preparer.respond_to?(:buy_food)
preparer.buy_food(customers)
elsif preparer.respond_to?(:gas_up)
preparer.gas_up(vehicle)
preparer.fill_water_tank(vehicle)
end
}
end
end
puts "\nrespond_to? example:"
trip = Trip.new(
[Bicycle.new, Bicycle.new, Bicycle.new],
[Customer.new, Customer.new],
Vehicle.new )
preparers = [TripCoordinator.new, Driver.new, Mechanic.new]
trip.prepare(preparers)