Templete Method
新幹線が退屈なのでたまにはRubyのコーディングでも勉強してみます。
もうすぐ新横浜。
ちょっと前に買ってほったらかしにしてたこの本で勉強してみます。
Rubyによるデザインパターン。
- 作者: Russ Olsen,ラス・オルセン,小林健一,菅野裕,吉野雅人,山岸夢人,小島努
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
- 購入: 12人 クリック: 193回
- この商品を含むブログ (58件) を見る
なんとなく「でざいんぱたーん」の響きにやられて衝動買いしてしまった一品。
なんちゃって「デザインパターン」の知識しかない僕には良い復習になるんじゃないかと。
「はっはーん、ふふーん、はいはい、こまんどぱたーんね。」と曖昧な返事しかできないようじゃ厳しいかと。
そんで、第1回はTemplete Method。
プログラムのおおまかな流れをスーパークラスで定義しておいて、
プログラムの変化する部分をサブクラスでオーバーライド実装します。
これは問題ないのでコードだけ。
それはそうと、Rubyの場合、抽象メソッドを定義できないから、
こんなふうに例外を返すメソッドを定義して抽象メソッドとするみたいね。
def output_head raise "Called Abstract method : output_head" end
登場するクラス
- Report
- レポート出力するクラス。メソッドのテンプレートを定義するクラス。変化する実装はサブクラスでオーバーライドする。
- HTMLReport
- HTMLレポートを出力するクラス。Reportのサブクラス。
- PlainReport
- プレーンなレポートを出力するクラス。Reportのサブクラス。
report.rb
class Report def initialize @title = "日記" @text = ["今日は大阪に行ってきました。", "天気は晴れでした。"] end def output_report output_start output_head output_body_start output_body output_body_end output_end end def output_start end def output_head raise "Called Abstract method : output_head" end def output_body_start end def output_body @text.each { |line| output_line line } end def output_line(line) raise "Called Abstract method : output_line" end def output_body_end end def output_end end end
html_report.rb
require "report" class HTMLReport < Report def initialize super end def output_start puts "<html>" end def output_head puts "<head>" puts "<title>#{@title}</title>" puts "</head>" end def output_body_start puts "<body>" end def output_line(line) puts "<p>#{line}</p>" end def output_body_end puts "</body>" end def output_end puts "</html>" end end
plain_report.rb
class PlainReport < Report def initialize super end def output_head puts "*****#{@title}*****" end def output_line(line) puts line end end
- 実行プログラム(main.rb)
require 'html_Report' require "plain_report" puts "HTML REPORT--------" report = HTMLReport.new report.output_report puts "PLAIN REPORT--------" report = PlainReport.new report.output_report
実行結果
HTML REPORT-------- <html> <head> <title>日記</title> </head> <body> <p>今日は大阪に行ってきました。</p> <p>天気は晴れでした。</p> </body> </html> PLAIN REPORT-------- *****日記***** 今日は大阪に行ってきました。 天気は晴れでした。