/
composite.rb
63 lines (46 loc) · 1.02 KB
/
composite.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
# Composite Design pattern
module Menu
attr_accessor :display_name, :parent
def initialize(display_name)
@display_name = display_name
@parent = nil
end
def parent
@parent ? @parent.display_name : "none"
end
def display
puts "#{@display_name} (Parent: #{parent})"
end
end
class ParentMenu
include Menu
attr_reader :sub_menus
def initialize(display_name)
super(display_name)
@sub_menus = []
end
def <<(sub_menu)
@sub_menus << sub_menu
sub_menu.parent = self
return sub_menu
end
def display
super
@sub_menus.each do |s|
s.display
end
end
end
class MenuItem
include Menu
end
# construct a tree of menus
root_menu = ParentMenu.new('File')
root_menu << MenuItem.new('New')
recent = root_menu << ParentMenu.new('Recent')
recent << MenuItem.new(' Budget.rb')
recent<< MenuItem.new(' Passwords.txt')
recent << MenuItem.new(' GroceryList.txt')
root_menu << MenuItem.new('Exit')
# display the root menu
root_menu.display