본문 바로가기

JAVA/GOF Design Pattern

GOF Iterator 패턴

SMALL

Iterator 패턴은 객체 지향 디자인 패턴 중 하나로, 컬렉션 객체의 요소에 접근하기 위한 일관된 인터페이스를 제공하는 패턴입니다.

Iterator 패턴을 사용하면, 컬렉션 객체의 내부 구조를 외부로 노출하지 않고도 요소에 접근할 수 있습니다. 이는 객체의 캡슐화를 유지하는 데 도움이 되며, 컬렉션 객체와 사용자 간의 결합도를 낮춰줍니다.

Iterator 패턴은 주로 다음과 같은 상황에서 사용됩니다.
- 컬렉션 객체의 내부 구조를 숨기고, 요소에 일관된 방식으로 접근하고 싶을 때
- 여러 종류의 컬렉션 객체를 일관된 방식으로 접근하고 싶을 때
- 컬렉션 객체를 순회하면서 요소를 제거하는 등의 작업을 수행할 때

Iterator 패턴은 일반적으로 Iterator, ConcreteIterator, Aggregate, ConcreteAggregate 등의 클래스로 구성됩니다. Iterator 클래스는 요소에 접근하기 위한 인터페이스를 정의하고, ConcreteIterator 클래스는 실제로 요소에 접근하는 역할을 합니다. Aggregate 클래스는 컬렉션 객체의 인터페이스를 정의하고, ConcreteAggregate 클래스는 실제로 컬렉션 객체를 구현합니다.

아래 코드를 통해 구현 예제를 보겠습니다.

 

먼저 User 클래스입니다. 생성자로 name, age, loginId를 받고, 그것을 보내주는 get함수로 이루어져 있습니다.

package gof.iterator;

public class User {
    private String name;
    private int age;
    private String loginId;

    public User(String name, int age, String loginId) {
        this.name = name;
        this.age = age;
        this.loginId = loginId;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getLoginId() {
        return loginId;
    }
}

Aggregate 인터페이스 입니다.

package gof.iterator;

interface Aggregate {
    Iterator iterator();
}

Iterator 인터페이스입니다. hasNext와, next가 추상메서드로 정의되어 있습니다.

package gof.iterator;

public interface Iterator {
    boolean hasNext();
    Object next();
}

Iterator를 가져오는 Container 인터페이스 입니다.

package gof.iterator;

public interface Container {
    Iterator getIterator();
}

Iterator 클래스를 구현한 UserIterator 클래스입니다.

hasNext와 next 메서드를 재정의했습니다.

package gof.iterator;

import java.util.List;

public class UserIterator implements Iterator {
    private List<User> userList;

    int currentPosition = 0;

    public UserIterator(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public boolean hasNext() {
        return currentPosition < userList.size();
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return userList.get(currentPosition ++);
        }

        return null;
    }
}

Container 클래스를 구현한 UserRepository 클래스입니다.

getIterator 메서드를 재정의해서 UserIterator 객체를 생성해서 가져옵니다.

package gof.iterator;

import java.util.List;

public class UserRepository implements Container {

    private List<User> userList;

    public UserRepository(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public Iterator getIterator() {
       return new UserIterator(this.userList);
    }
   
}

Client 클래스로 iterator 패턴이 잘 동작하는지 테스트해본 결과입니다.

package gof.iterator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Client {
    public static void main(String[] args) {
        UserRepository userRepository = new UserRepository(getTestUserList());

        for (Iterator it = userRepository.getIterator(); it.hasNext();) {
            System.out.println("===========================================");
            User user = (User) it.next();
            System.out.println(user.getName());
            System.out.println(user.getAge());
            System.out.println(user.getLoginId());
            System.out.println("===========================================");
        }
    }

    private static List<User> getTestUserList() {
        return new ArrayList<>(
            Arrays.asList(
                   new User("홍길동", 20, "gildong"),
                   new User("이순신", 50, "sunshin"),
                   new User("김첨지", 43, "chumji"),
                   new User("신사임당", 20, "imgentleman")
           )
        );
    }
}
 

* Refrence : https://keencho.github.io/posts/iterator-pattern/

LIST

'JAVA > GOF Design Pattern' 카테고리의 다른 글

GOF Observer Pattern  (0) 2023.05.09
GOF Abstract Factory Pattern  (0) 2023.05.08
Gof Template method 패턴  (0) 2023.04.28
GOF Factory method 패턴  (0) 2023.04.26
GOF singleton 패턴  (0) 2023.04.26