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