Decorator pattern : Decorator « Design Patterns « Ruby






Decorator pattern


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')

 








Related examples in the same category