Design Patterns Ruby

class Printer
  def initialize(path)
    @file = File.open(path, 'w')
  end
  def write_line(line)
    @file.print(line)
    @file.print("\n")
  end
  def pos
    @file.pos
  end
  def rewind
    @file.rewind
  end
  def close
    @file.close
  end
end
class PrinterDecorator
  def initialize(real_writer)
    @real_writer = real_writer
  end
  def write_line(line)
    @real_writer.write_line(line)
  end
  def pos
    @real_writer.pos
  end
  def rewind
    @real_writer.rewind
  end
  def close
    @real_writer.close
  end
end
class NumberPrinter < PrinterDecorator
  def initialize(real_writer)
    super(real_writer)
    @line_number = 1
  end
  def write_line(line)
    @real_writer.write_line("#{@line_number}: #{line}")
    @line_number += 1
  end
end
writer = NumberPrinter.new(Printer.new('final.txt'))
writer.write_line('Hello out there')
class StringPrinter < PrinterDecorator
  attr_reader :check_sum
  def initialize(real_writer)
    @real_writer = real_writer
    @check_sum = 0
  end
  def write_line(line)
    @real_writer.write_line(line)
  end
end
class TimeStampingWriter < PrinterDecorator
  def write_line(line)
    @real_writer.write_line("#{Time.new}: #{line}")
  end
end
writer = StringPrinter.new(TimeStampingWriter.new(
             NumberPrinter.new(Printer.new('final.txt'))))
writer.write_line('Hello out there')