Ruby/Design Patterns/Strategy

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

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



Sharing Data between the Context and the Strategy

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(self)
  end
end
class Formatter
  def output_report(context)
    raise "Abstract method called"
  end
end
class HTMLFormatter < Formatter
  def output_report(context)
    puts("<html>")
    puts("  <head>")
    puts("    <title>#{context.title}</title>")
    puts("  </head>")
    puts("  <body>")
    context.text.each do |line|
      puts("    <p>#{line}</p>")
    end
    puts("  </body>")
    puts("</html>")
  end
end



Strategy pattern with Ruby dynamic attributes

class Document
  attr_reader :title, :text
  attr_accessor :formatter
  def initialize(formatter)
    @title = "Your Document"
    @text =  ["Things are going", "really, really well."]
    @formatter = formatter
  end
  def output_report()
    @formatter.output_report(self)
  end
end
class HTMLFormatter
  def output_report(context)
    puts("<html>")
    puts("  <head>")
    puts("    <title>#{context.title}</title>")
    puts("  </head>")
    puts("  <body>")
    context.text.each do |line|
      puts("    <p>#{line}</p>")
    end
    puts("  </body>")
    puts("</html>")
  end
end
class PlainTextFormatter
  def output_report(context)
    puts("#{context.title}")
    context.text.each do |line|
      puts(line)
    end
  end
end