Mega Code Archive

 
Categories / Ruby / Design Patterns
 

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