たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

Rubyで書くDecoratorパターン

もはや何番煎じかもわからないRubyデザインパターンについて書く。今回は decorator パターンについて。

今回実施したこと

デザインパターンの decorator パターンについて簡単に実装したので、そのメモを残す。そもそもの発端は以下のDraperを使ってRailsでのDecoratorパターンについて調べようと思ったが、Rubyの方も怪しかったので一旦Ruby側で実装してからRailsに臨もうと思う。

今回使用した環境

普通にターミナルで vi で実装した。

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" を追加する。

参考

qiita.com