forked from piscolomo/ruby-patterns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
command.rb
66 lines (57 loc) · 1019 Bytes
/
command.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
# Encapsulate a request as an object, thereby letting you parameterize clients
# with different requests, queue or log requests, and support undoable operations
class Turn
def initialize
@commands = []
end
def run_command(command)
command.execute
@commands << command
end
def undo_command
@commands.pop.unexecute
end
end
class Hero
attr_reader :money, :health
def initialize
@money = 0
@health = 100
end
end
class GetMoneyCommand
def initialize(hero)
@hero = hero
end
def execute
@hero.money += 10
end
def unexecute
@hero.money -= 10
end
end
class HealCommand
def initialize(hero)
@hero = hero
end
def execute
@hero.health += 10
end
def unexecute
@hero.health -= 10
end
end
# Usage
hero = Hero.new
get_money = GetMoneyCommand.new hero
heal = HealCommand.new hero
turn = Turn.new
turn.run_command(heal)
puts hero.health
# => 110
turn.run_command(get_money)
puts hero.money
# => 10
turn.undo_command
puts hero.money
# => 0