이터레이터(iterator) 패턴: 행위패턴
컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 주는 패턴
반복자 패턴이라고도 부른다. 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들수 있다. 반복자 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것이다.
- Iterator
- 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의
- ConcreateIterator
- Iterator 인터페이스를 구현함
- Aggregate
- 여러 요소들로 이루어져 있는 집합체
- ConcreateAggregate
- Aggreagate 인터페이스를 구현하는 클래스
스팀에서 다운로드 받은 게임을 반복자를 돌려 확인해보자
Steam
package behavioral.iterator;
import java.util.Iterator;
public class Steam implements Aggregate{
private Game[] games;
private int last = 0;
public Steam(int size) {
games = new Game[size];
}
public Game getGame(int index){
return games[index];
}
public int getLength(){
return last;
}
public void addGame(Game game){
if(last < games.length){
this.games[last] = game;
last++;
} else {
System.out.println("게임을 더 다운받을 수 없습니다.");
}
}
@Override
public Iterator createIterator() {
return new SteamIterator(this);
}
}
Game
package behavioral.iterator;
import lombok.Getter;
@Getter
public class Game {
private String name;
public Game(String name) {
this.name = name;
}
}
Aggregate
package behavioral.iterator;
import java.util.Iterator;
public interface Aggregate {
Iterator createIterator();
}
SteamIterator
package behavioral.iterator;
import java.util.Iterator;
public class SteamIterator implements Iterator<Game> {
private Steam steam;
private int index = 0;
public SteamIterator(Steam steam) {
this.steam = steam;
}
@Override
public boolean hasNext() {
return index < steam.getLength();
}
@Override
public Game next() {
Game game = steam.getGame(index);
index++;
return game;
}
}
Client
package behavioral.iterator;
import java.util.Iterator;
public class IteratorClient {
public static void main(String[] args) {
Steam steam = new Steam(5);
steam.addGame(new Game("배틀그라운드"));
steam.addGame(new Game("몬스터헌터"));
steam.addGame(new Game("엘든링"));
System.out.println("게임을 " + steam.getLength() + "개 만큼 다운로드 받았습니다.");
Iterator iter = steam.createIterator();
while(iter.hasNext()){
Game game = (Game)iter.next();
System.out.println(game.getName());
}
}
}
Reference
'OOP > Design Pattern' 카테고리의 다른 글
17. 메멘토(Memento) 패턴 (0) | 2023.02.25 |
---|---|
16. 중재자(Mediator) 패턴 (0) | 2023.02.21 |
14. 인터프리터(Interpreter) 패턴 (0) | 2023.02.21 |
13. 커맨드(Command) 패턴 (0) | 2023.02.20 |
12. 프록시(Proxy) 패턴 (0) | 2023.02.20 |