The Strategy Pattern really resolves to “composition” in practice. This OO technique says to take components that could change at runtime and encapsulate them in their own objects. The master-object is then “composed” of instances of the dependent clasess.
Example:
class Duck
def fly
puts ‘Flap Flap’
end
def quack
puts ‘Quack!’
end
end
d = <span class="constant">Duck.new
d.flap
d.quack
Produces:
Flap Flap Quack!
So now handle the en-user request to have ducks with different flap :
class FlapWings
def fly
puts ‘Flap Flap’
end
end
class FlapSoaring
def fly
puts ‘Soaring in the wind’
end
end
class Duck
def initialize (flapInstance)
@flapDelegate = flapInstance
end
def changeFlap(flapInstance)
@flapDelegate = flapInstance
end
def fly
@flapDelegate.fly
end
def quack
puts ‘Quack!’
end
end
mallard = Duck.new(FlapWings.new)
mallard.fly
mallard.quack
mallard.changeFlap(FlapSoaring.new)
mallard.fly
Now produces :
Flap Flap Quack! Soaring in the wind
This example looks trivial. The technique is powerful. Behold that in Java/C#, this requires a lot of effort including Inheritance and Interfaces.
Nice that Ruby allows this run-time change through duck-typing!!