第4章 アルゴリズムを交換する: Strategy part2
Ruby
Published: 2019-06-20

「Rubyによるデザインパターン」の読書メモです。

時々、個人の見解入りです。

クラスベースの Strategy ではなく、コードブロックベースの Strategy パターンで書いてみます。

Strategy を適用する (簡易版)

class Report

  attr_reader :title, :text
  attr_accessor :formatter

  def initialize(&formatter)
    @title = '月次報告'
    @text = ['順調', '最高']
    @formatter = formatter
  end

  def output_report
    @formatter.call(self)
  end
end

HTML_FORMATTER = lambda do |context|
  puts '<html>'
  puts "<head><title>#{context.title}</title></head>"
  puts('<body>')
  context.text.each do |line|
    puts("<p>#{line}</p>")
  end
  puts('</body>')
  puts '</html>'
end

PLAIN_TEXT_FORMATTER = lambda do |context|
  puts("*****#{context.title}*****")
  context.text.each do |line|
    puts(line)
  end
end

report = Report.new &HTML_FORMATTER
report.output_report

report = Report.new &PLAIN_TEXT_FORMATTER
report.output_report

コードブロックのストラテジは、そのインターフェースが単純で、1つのメソッドで事足りるようなときにのみ有効に働きます。