デザインパターン(iterator)
最近設計ではまることが多いので
デザインパターンをrubyで復習することにしました。
ここ↓を参考にrubyで演習問題解いていきます。
http://www.techscore.com/tech/DesignPattern/index.html
まずはiteratorから
http://www.techscore.com/tech/DesignPattern/Iterator2.html
rubyなのでiteratorのinterface部分は削除、
class Student
attr_reader(:name, :sex)
def initialize(name, sex)
@name = name
@sex = sex
end
endmodule Aggregate
attr_accessor(:iterator)
endclass 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)
endclass 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)
endclass MyStudentList < StudentList
def initialize(student_list)
super(student_list)
@iterator = MyStudentIterator.new(self)
end
endclass AbstractTeacher
def create_studentlist; end
protected
attr_accessor(:student_list)
endclass 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
endyou = MyTeacher.new
you.create_studentlist
you.call_students
aggregate部分はmoduleで作成しています
図はこんな感じ↓