デザインパターン-ChainOfResponsibility



Chain Of Responsibilityパターンとは

Chain Of Responsibilityパターンは、複数のオブジェクトを鎖状につなぎ、その中の任意のオブジェクトが要求を処理するまで、順次その鎖に沿って要求を受流していくパターンです。

オブジェクトが自分では処理しきれないタスクであると判断したら、処理の責任を次のオブジェクトに処理を渡すという連鎖構造における「要求のたらい回し」といえます。

「Chain of Responsibility」とは「責任の連鎖」という意味です。


Chain Of Responsibilityパターンの利点


Chain Of Responsibilityパターンの欠点


構成要素


rubyによるChainOfResponsibilityパターンの実装

FizzBuzz問題をChainデザインパターンで記述します。

3の倍数のときは数の代わりにFizzと、5の倍数のときはBuzzとプリントし、3と5両方の倍数の場合にはFizzBuzzとプリントすること。

無駄な実装であり、処理速度は遅いですが、オブジェクト間の拡張性があります。

#!/usr/bin/env ruby

# Handler(抽象取扱者・処理者)
class Handler
  def initialize()
    @next = nil
  end
  # チェーンの作成
  def set_next(next_obj)
    @next = next_obj
  end

  # 要求の受付
  def request(number)
    if(check_number(number))
      return(true)
    elsif(@next != nil)
      @next.request(number)
    else
      puts(number)
    end
  end
  def check_number
  end
end

# ConcreteHandler(具象取扱者・具体的な処理者) 
class FizzBuzz < Handler
  def check_number(number)
    return(false) if not((number % 3 == 0) and (number % 5 == 0))
    puts("Fizz Buzz(#{number})")
    return(true)
  end
end

class Fizz < Handler
  def check_number(number)
    return(false) if not(number % 3 == 0)
    puts("Fizz(#{number})")
    return(true)
  end
end

class Buzz < Handler
  def check_number(number)
    return(false) if not(number % 5 == 0)
    puts("Buzz(#{number})")
    return(true)
  end
end

# 連鎖の作成
fbzz = FizzBuzz.new
buzz = Buzz.new
fizz = Fizz.new
fbzz.set_next(buzz)
buzz.set_next(fizz)

for e in 1..100
  fbzz.request(e)
end


関連ページ



スポンサード リンク