デザインパターン(iterator)

最近設計ではまることが多いので
デザインパターンrubyで復習することにしました。
ここ↓を参考にrubyで演習問題解いていきます。
http://www.techscore.com/tech/DesignPattern/index.html


まずはiteratorから
http://www.techscore.com/tech/DesignPattern/Iterator2.html


class Student
attr_reader(:name, :sex)

def initialize(name, sex)
@name = name
@sex = sex
end
end

module Aggregate
attr_accessor(:iterator)
end

class StudentList
include Aggregate

def initialize(cnt)
@students = Array.new(cnt)
@last = 0
end

def add(student)
if(@students == nil || @students.size < @last + 1)
raise "Error, exceeds the size!"
end
@students[last] = student;
@last += 1
end

def index(index)
@students[index]
end

def each
@students.each{|i|
yield(i)
}
end

attr_reader(:last)

end

class MyStudentIterator
def initialize(student_list)
@student_list = student_list
@index = 0
end

# true or false
def has_next
@student_list.last > @index
end

# student
def _next
index = @index
@index += 1
@student_list.index(index)
end

private
attr_accessor(:student_list, :index)

end

class MyStudentList < StudentList
def initialize(student_list)
super(student_list)
@iterator = MyStudentIterator.new(self)
end
end

class AbstractTeacher
def create_studentlist; end

protected
attr_accessor(:student_list)

end

class MyTeacher < AbstractTeacher
# name sex
# 赤井亮太  男
# 赤羽里美  女
# 岡田美央  女
# 西森俊介  男
# 中ノ森玲菜 女
def create_studentlist
list = MyStudentList.new(5)
[
["赤井亮太", "男"],
["赤羽里美", "女"],
["岡田美央", "女"],
["西森俊介", "男"],
["中ノ森玲菜", "女"]
].each{|a|
list.add(Student.new(a[0],a[1]))
}
@student_list = list
end

def call_students
itr = @student_list.iterator
while(itr.has_next)
puts itr._next.name
end
end

end

you = MyTeacher.new
you.create_studentlist
you.call_students

rubyなのでiteratorのinterface部分は削除、
aggregate部分はmoduleで作成しています
図はこんな感じ↓