Skip to content

Instantly share code, notes, and snippets.

@neerajkumar
Created June 6, 2018 14:22
Show Gist options
  • Save neerajkumar/31fa3c3a6ca75f4daea22563a779a4b8 to your computer and use it in GitHub Desktop.
Save neerajkumar/31fa3c3a6ca75f4daea22563a779a4b8 to your computer and use it in GitHub Desktop.
Design Pattern: Decorator Pattern - Ruby Solution
## ConcreteComponent
class SimpleWriter
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
## Decorator
class WriterDecorator
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
## Component
class NumberingWriter < WriterDecorator
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
## Component
class CheckSummingWriter < WriterDecorator
attr_reader :check_sum
def initialize(real_writer)
super(real_writer)
@check_sum = 0
end
def write_line(line)
line.each_byte { |byte| @check_sum = (@check_sum + byte) % 256 }
@check_sum = @check_sum.to_s
@check_sum += "\n" [0] % 256
@real_writer.write_line(line)
end
end
## Component
class TimeStampingWriter < WriterDecorator
def initialize(real_writer)
super(real_writer)
end
def write_line(line)
@real_writer.write_line("#{Time.now}: #{line}")
end
end
writer = CheckSummingWriter.new(TimeStampingWriter.new(NumberingWriter.new(SimpleWriter.new('final.txt'))))
writer.write_line('Hello Out There')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment