Паттерны / Паттерны поведения
image

# ConcreteStrategy
class AddStrategy
    def do_operation(a, b)
        return a + b
    end
end

# ConcreteStrategy
class SubtractStrategy
    def do_operation(a, b)
        return a - b
    end
end

# Context
class Calc
    def initialize()
        @strategy = nil
    end

    def execute(a, b)
        return 0 if @strategy == nil
        return @strategy.do_operation(a, b)
    end

    def set_strategy(strategy)
        @strategy = strategy
    end
end

calc = Calc.new
result1 = calc.execute(53)
# result1 is 0

calc.set_strategy(AddStrategy.new)
result2 = calc.execute(53)
# result2 is 8

calc.set_strategy(SubtractStrategy.new)
result3 = calc.execute(53)
# result3 is 2

puts "result1 is #{result1}"
puts "result2 is #{result2}"
puts "result3 is #{result3}"


Определяет семейство алгоритмов, инкапсулируя их и позволяя подставлять один вместо другого. Можно менять алгоритм независимо от клиента, который им пользуется.