ウィンブルドンを目指すエンジニアブログ

テニスを週4で習っている、Rubyエンジニアの日常です。

Javaで学ぶデザインパターン入門をRubyで書いてみた(decoratorパターン)

初投稿です😊 ウィンブルドンについてはまだ語りません(テニス始めたの2018/11/1です爆笑) アドベントカレンダーに初参加&人生で初記事 特に思いつかなかったので、この前社内の勉強会でやったもの載せます笑

増補改訂版Java言語で学ぶデザインパターン入門

有名なGoFデザインパターンの本ですね!✨ どの言語でも必須のデザインパターン。 書籍内のJavaコードをRubyコードに書き換えるのはそれはそれで勉強になるのではないか?
となり5.6名でモブプロをしながらあーだこーだ言いながら輪読後に書き換えをしました。 実際動かして綺麗に結果が出ると感動します笑

下記のソースはとりあえず動くようにはなっています。
そんな書き方じゃないだろ!!!とかあったらビシバシコメント下さい🙇‍♂️(Ruby初心者なので。。。)
Javaの元コードは書籍を買うか、エンジニアがいる会社なら誰かしら持っていると思うので頑張って下さい笑

decoratorパターンをRubyで書いてみました! 実行結果が一番キラキラしていた笑

class Display
  def columns
    raise NotImplementedError
  end

  def rows
    raise NotImplementedError
  end

  def row_text(row)
    raise NotImplementedError
  end

  def show
    rows.times do |num|
      puts row_text(num)
    end
  end
end

class StringDisplay < Display
  def initialize(string)
    @string = string
  end

  #initializeと同じだからいらん?
  def srting_display(string)
    @string = string
  end

  def columns
    @string.length
  end

  def rows
    1
  end

  def row_text(row)
    row.zero? ? @string : nil
  end
end

class Border < Display
  def initialize(display)
    @display = display
  end
end

class SideBorder < Border
  def initialize(display, side_char)
    super(display)
    @border_char = side_char
  end

  def columns
    1 + @display.columns + 1
  end

  def rows
    @display.rows
  end

  def row_text(row)
    @border_char + @display.row_text(row) + @border_char
  end
end

class FullBorder < Border
  def initialize(display)
    super(display)
    @display = display
  end

  def columns
    1 + @display.columns + 1
  end

  def rows
    1 + @display.rows + 1
  end

  def row_text(row)
    if row.zero?
      "+" + make_line('-', @display.columns) + "+"
    elsif row == @display.rows + 1
      "+" + make_line('-', @display.columns) + "+"
    else
      "|" + @display.row_text(row - 1) + "|"
    end
  end

  def make_line(full_char, count)
    buffer = ""
    count.times do
      buffer << full_char
    end
    buffer
  end
end

class Main
  def main
    b1 = StringDisplay.new("Hello, world.")
    b2 = SideBorder.new(b1, "#")
    b3 = FullBorder.new(b2)
    b1.show
    b2.show
    b3.show
    b4 =
      SideBorder.new(
        FullBorder.new(
          FullBorder.new(
            SideBorder.new(
              FullBorder.new(
                StringDisplay.new("hello")
              ),
              '*'
            )
          )
        ),
        '/'
      )
    b4.show
  end
end

Main.new.main

実行結果
f:id:yuya05020:20181219184648p:plain

最初にnewしたインスタンスに対してどんどん飾り付けしていくパターンですね!(雑!!!)

12. Decorator パターン | TECHSCORE(テックスコア)
ここ見ておけば問題ないですね! では終わります笑