「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つのメソッドで事足りるようなときにのみ有効に働きます。