Rubyで書くDecoratorパターン
もはや何番煎じかもわからないRubyのデザインパターンについて書く。今回は decorator パターンについて。
今回実施したこと
デザインパターンの decorator パターンについて簡単に実装したので、そのメモを残す。そもそもの発端は以下のDraperを使ってRailsでのDecoratorパターンについて調べようと思ったが、Rubyの方も怪しかったので一旦Ruby側で実装してからRailsに臨もうと思う。
Decorator パターンとは
色々書いてあるけど、「既存クラスへ影響しないようにクラスに機能追加を行う」と捉えておけば良い気がする。(さすがにざっくりすぎるかも)
やりたいこと
アイスクリームにトッピングをする機能を追加するのをDecoratorパターンで書く。
例:VanillaIcecreamにCashewNutsの文字列を追加する。
SampleCode
以下が完成形。
class Icecream def initialize(ice) @ice = ice end def getName return @ice end end class Decorator def initialize(decoice) @decoice = decoice end end class CashewNuts < Decorator def getName return ("CashewNuts" + @decoice.getName) end end cn = CashewNuts.new(Icecream.new("VanillaIcecream")) p cn.getName cn = CashewNuts.new(Icecream.new("GreenTeaIcecream")) p cn.getName
Result
$ ruby decorator.rb "CashewNutsVanillaIcecream" "CashewNutsGreenTeaIcecream"
処理の流れ
基底クラスインスタンスを引数に、CashewNutsクラスのインスタンスを作成する。
CashewNutsクラス内では、今回機能を追加するgetNameの処理が記載されている。
そのgetNameの中では、引数にした基底クラスのgetNameメソッドからアイスの
名前(VanillaIcecream)をとってきて、その前に "CashewNuts" を追加する。