Replacing the Algorithm with the Strategy : Strategy « Design Patterns « Ruby






Replacing the Algorithm with the Strategy


class Formatter
  def output_report( title, text )
    raise 'Abstract method called'
  end
end

class HTMLFormatter < Formatter
  def output_report( title, text )
    puts('<html>')
    puts('  <head>')
    puts("    <title>#{title}</title>")
    puts('  </head>')
    puts('  <body>')
    text.each do |line|
      puts("    <p>#{line}</p>" )
    end
    puts('  </body>')
    puts('</html>')
  end
end

class PlainTextFormatter < Formatter
  def output_report(title, text)
    puts("#{title}")
    text.each do |line|
      puts(line)
    end
  end
end

class Document
  attr_reader :title, :text
  attr_accessor :formatter

  def initialize(formatter)
    @title = 'Document'
    @text =  [ 'Things are going', ' well.' ]
    @formatter = formatter
  end

  def output_report
    @formatter.output_report( @title, @text )
  end
end


report = Document.new(HTMLFormatter.new)
report.output_report

report.formatter = PlainTextFormatter.new
report.output_report

 








Related examples in the same category

1.Sharing Data between the Context and the Strategy
2.Strategy pattern with Ruby dynamic attributes