티스토리 뷰
반복자 패턴 (Iterator Pattern)
접근기능과 자료구조를 분리시켜서 객체화합니다. 서로 다른 구조를 가지고 있는 저장 객체에 대해서 접근하기 위해서 interface를 통일시키고 싶을 때 사용하는 패턴입니다.
동기
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
다음과 같이 배열 요소에 접근하기 위한 반복문이 있습니다. 여기서 arr의 타입이 배열이 아닌 다른 자료 구조로 바뀐다면 이 반복문은 수정이 되어야 합니다. Iterator는 이러한 자료구조에 상관없이 객체 접근 방식을 통일시키고자 할 떄 사용됩니다.
Iterator Pattern Structure
● Iterator : 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의
● ConcreateIterator : Iterator 인터페이스를 구현함
● Aggregate : 여러 요소들로 이루어져 있는 집합체
● ConcreateAggregate : Aggreagate 인터페이스를 구현하는 클래스
예제
● Study_Group : 다수의 Student 객체를 가지는 복합 클래스입니다.
● StudyGroupIterator : 복합 객체와는 분리되면서 복합 객체에 순차적으로 접근하기 위한 iterator
예제는 스터디 그룹에 참여하는 학생들에 대한 정보를 가지는 Study_Group 객체에 대한 접근을 Iterator 패턴을 적용하여 순차적으로 검색하는 예제입니다.
Aggregate.interface 와 Iterator.interface
1
2
3
4
5
6
7
8 |
public interface Aggregate {
public abstract Iterator iterator();
}
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
} |
Aggregate의 인터페이스를 구현하는 복합 클래스는 반드시 iterator 객체를 생성하는 메서드를 구현합니다.
Iterator 인터페이스를 구현하는 클래스는 접근 할 데이터가 있는지 판단하는 hasNext()와 해당 인덱스의 객체를 반환 받는 next() 메서드를 반드시 구현합니다.
Student.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
public class Student {
private String name="";
private int age ;
public Student(String name, int age)
{
this.name=name;
this.age =age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
} |
복합 클래스가 가지는 학생 정보를 가지고 있는 데이터 객체입니다.
Study_Group.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
public class Study_Group implements Aggregate{
private Student[] Students;
private int num =0;
public Study_Group(int num)
{
this.Students = new Student[num];
}
public Student getStudent(int index)
{
return Students[index];
}
public void AddStudnet(Student student)
{
this.Students[num] = student;
num++;
}
public int getLength()
{
return num;
}
public StudyGroupIterator iterator()
{
return new StudyGroupIterator(this);
}
} |
실제 Student 객체를 포함하는 복합 클래스입니다. iterator() 메서드를 통해 iterator 객체를 생성 한 후 반환합니다.
StudyGroupIterator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
public class StudyGroupIterator implements Iterator {
private Study_Group study_group;
private int index;
public StudyGroupIterator(Study_Group study_group)
{
this.study_group =study_group;
this.index = 0;
}
public boolean hasNext()
{
if(index < study_group.getLength())
{
return true;
}
else
{
return false;
}
}
public Object next()
{
Student student = study_group.getStudent(index);
index++;
return student;
}
} |
실제 Study_Group 객체에 접근하기 위한 Iterator 클래스입니다. Study_Group 의 인스턴스를 가지고 있으며 해당 인스턴스를 통해 Study_Group가 포함하는 Student 객체에 접근을 하고 있습니다.
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
public class Main {
public static void main(String argsp[])
{
Study_Group study_group = new Study_Group(5);
study_group.AddStudnet(new Student("이기택",27));
study_group.AddStudnet(new Student("최민수",27));
study_group.AddStudnet(new Student("원빈",27));
study_group.AddStudnet(new Student("홍길동",27));
study_group.AddStudnet(new Student("나비",27));
StudyGroupIterator iterator = study_group.iterator();
while(iterator.hasNext())
{
Student student = (Student)iterator.next();
System.out.println("이름:" + student.getName());
System.out.println("나이:" + student.getAge());
System.out.println("------------------");
}
}
}
|
Iterator를 통해 데이터에 접근하는 main 영역입니다.
'Study > 디자인 패턴' 카테고리의 다른 글
10 역할 사슬 패턴 (Chain Of Responsibility) (0) | 2017.09.28 |
---|---|
09 퍼사드 패턴 (Facade Pattern) (0) | 2017.09.26 |
07 브릿지 패턴 (Bridge Pattern) (0) | 2017.09.22 |
06 프록시 패턴 (Proxy Pattern) (0) | 2017.09.21 |
05 어댑터 패턴 (Adapter Pattern) (0) | 2017.09.16 |