# Chain of Responsibilityパターン # #Java言語で学ぶデザインパターンと同様の例題をRubyで記述した。 # # coded by Takehiro Kaga # class Trouble def initialize(number) @number = number end def number @number end end class Support def initialize(name) @name = name @next = nil end def name @name end def setNext(nextperson) @next = nextperson end def support(trouble) if resolve(trouble) done(trouble) elsif @next != nil @next.support(trouble) else fail(trouble) end end def resolve(trouble) end def done(trouble) puts "[Trouble " + trouble.number.to_s + "]" + " is resolved by " + "[" + self.name + "]." end def fail(trouble) puts "[Trouble " + trouble.number.to_s + "]" + " cannot be resolved." end end class NoSupport < Support def initialize(name) super(name) end def resolve(trouble) false end end class LimitSupport < Support def initialize(name, limit) super(name) @limit = limit end def resolve(trouble) if trouble.number < @limit true else false end end end class OddSupport < Support def initialize(name) super(name) end def resolve(trouble) if trouble.number % 2 == 1 true else false end end end class SpecialSupport < Support def initialize(name, number) super(name) @number =number end def resolve(trouble) if trouble.number == @number true else false end end end alice = NoSupport.new("Alice") bob = LimitSupport.new("Bob", 100) charlie = SpecialSupport.new("Charlie", 429) diana = LimitSupport.new("Diana", 200) elmo = OddSupport.new("Elmo") fred = LimitSupport.new("Fred", 300) # 連鎖の形成 alice.setNext(bob) bob.setNext(charlie) charlie.setNext(diana) diana.setNext(elmo) elmo.setNext(fred) # さまざまなトラブル発生 =begin i = 0 while i < 500 alice.support(Trouble.new(i)) i += 33 end =end 0.step(499, 33) { |i| alice.support(Trouble.new(i)) }