今日の勉強

デザインパターンの種類は全部で23個。一ヶ月もあれば制覇できる。ただ、読むだけでは頭に入らないと思うので実際に書くようにする。

Iteratorパターンはループをまわす処理を実装に依存しないようにするパターン。つまり、どんな実装であろうと、その集合がなんであれ同じようにループをまわせるようにすること。
例えば次の要素が存在するかを判断するメソッドhas_next?と次の要素を取り出すnextメソッドの2つによって、どんな集合であろうと同じようにループをまわすことができるようになる。

サンプルソースRubyで書いてみる。keyを持つkeyboardという集合を表します。

# key class
class Key
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

# keyboard class
class Keyboard
  def initialize
    @keys = Array.new
  end
  
  def get_key_at(index)
    @keys[index]
  end
  
  def append_key(key)
    @keys << key
  end
  
  def get_length
    @keys.length
  end
  
  def iterator
    KeyboardIterator.new(self)
  end
end

# keyboarditerator class
class KeyboardIterator
  def initialize(keyboard)
    @keyboard = keyboard
    @index = 0
  end
  
  def has_next?
    @index < @keyboard.get_length
  end
  
  def next
    key = @keyboard.get_key_at(@index)
    @index += 1
    key
  end
end

# main
keyboard = Keyboard.new
keyboard.append_key(Key.new('A'))
keyboard.append_key(Key.new('B'))
keyboard.append_key(Key.new('C'))
keyboard.append_key(Key.new('D'))

iterator = keyboard.iterator

while iterator.has_next?
  key = iterator.next
  puts key.name
end

Iterator.rd
こちらにはものすごい例が…
Rubyはいろんな書き方ができて楽しいですね!