この記事は何
デザインパターンについて、Rubyでどのような使い方ができるかをまとめた記事です。
デザインパターン自体の解説は詳しく行いません。
TemplateMethodパターンとは
TemplateMethodパターンとは、スーパークラスで処理の枠組みを定め、その一部をサブクラスで具体的に実装するデザインパターンです。
詳しくはこちらをご覧ください。
Rubyでのコード例
スーパークラスで手続きの流れを実装し、サブクラスで手続きの処理で呼び出しているメソッドの定義を行なっていきます。
class SuperClass
def template_method
method1
method2
method3
end
private
def method1
fail NotImplementedError
end
def method2
fail NotImplementedError
end
def method3
fail NotImplementedError
end
end
class SubClass < SuperClass
private
def method1
puts 'sub class method1'
end
def method2
puts 'sub class method2'
end
def method3
puts 'sub class method3'
end
end
SubClass.new.template_method
出力結果
sub class method1
sub class method2
sub class method3
どのような時に使えるか
処理の流れを共通化し、処理の内容をカスタマイズ可能な形を実現したい場合などに有効です。
例えば以下のようなコードはTemplateMethodパターンを用いることで再利用性の高いコードにすることができます。
# レポートの生成プロセスを定義するスーパークラス
class ReportGenerator
def generate_report
gather_data
format_report
print_report
end
private
def gather_data
fail NotImplementedError
end
def format_report
fail NotImplementedError
end
def print_report
fail NotImplementedError
end
end
# 特定のデータを収集し、レポートをフォーマットするサブクラス
class SalesReportGenerator < ReportGenerator
private
def gather_data
puts 'Gathering sales data...'
@data = 'Sales Data'
end
def format_report
puts 'Formatting sales report...'
@formatted_report = "Formatted: #{@data}"
end
def print_report
puts 'Printing sales report...'
puts @formatted_report
end
end
class InventoryReportGenerator < ReportGenerator
private
def gather_data
puts 'Gathering inventory data...'
@data = 'Inventory Data'
end
def format_report
puts 'Formatting inventory report...'
@formatted_report = "Formatted: #{@data}"
end
def print_report
puts 'Printing inventory report...'
puts @formatted_report
end
end
# サブクラスを利用してレポートを生成
SalesReportGenerator.new.generate_report
InventoryReportGenerator.new.generate_report
出力結果
Gathering sales data...
Formatting sales report...
Printing sales report...
Formatted: Sales Data
Gathering inventory data...
Formatting inventory report...
Printing inventory report...
Formatted: Inventory Data