Ruby/Design Patterns/Decorator

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск

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