Created
September 29, 2020 14:14
-
-
Save alxekb/69659997b5184a35c9042db2268d679a to your computer and use it in GitHub Desktop.
Ruby strategy pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
```# The Context defines the interface of interest to clients. | |
class Context | |
# The Context maintains a reference to one of the Strategy objects. The | |
# Context does not know the concrete class of a strategy. It should work with | |
# all strategies via the Strategy interface. | |
attr_writer :strategy | |
# Usually, the Context accepts a strategy through the constructor, but also | |
# provides a setter to change it at runtime. | |
def initialize(strategy) | |
@strategy = strategy | |
end | |
# Usually, the Context allows replacing a Strategy object at runtime. | |
def strategy=(strategy) | |
@strategy = strategy | |
end | |
# The Context delegates some work to the Strategy object instead of | |
# implementing multiple versions of the algorithm on its own. | |
def do_some_business_logic | |
# ... | |
puts 'Context: Sorting data using the strategy (not sure how it\'ll do it)' | |
result = @strategy.do_algorithm(%w[a b c d e]) | |
print result.join(',') | |
# ... | |
end | |
end | |
# The Strategy interface declares operations common to all supported versions of | |
# some algorithm. | |
# | |
# The Context uses this interface to call the algorithm defined by Concrete | |
# Strategies. | |
class Strategy | |
# @abstract | |
# | |
# @param [Array] data | |
def do_algorithm(_data) | |
raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" | |
end | |
end | |
# Concrete Strategies implement the algorithm while following the base Strategy | |
# interface. The interface makes them interchangeable in the Context. | |
class ConcreteStrategyA < Strategy | |
# @param [Array] data | |
# | |
# @return [Array] | |
def do_algorithm(data) | |
data.sort | |
end | |
end | |
class ConcreteStrategyB < Strategy | |
# @param [Array] data | |
# | |
# @return [Array] | |
def do_algorithm(data) | |
data.sort.reverse | |
end | |
end | |
# The client code picks a concrete strategy and passes it to the context. The | |
# client should be aware of the differences between strategies in order to make | |
# the right choice. | |
context = Context.new(ConcreteStrategyA.new) | |
puts 'Client: Strategy is set to normal sorting.' | |
context.do_some_business_logic | |
puts "\n\n" | |
puts 'Client: Strategy is set to reverse sorting.' | |
context.strategy = ConcreteStrategyB.new | |
context.do_some_business_logic``` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment