Created
June 6, 2018 14:22
-
-
Save neerajkumar/31fa3c3a6ca75f4daea22563a779a4b8 to your computer and use it in GitHub Desktop.
Design Pattern: Decorator Pattern - Ruby Solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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