디자인패턴 - Iterator 패턴

지환·2023년 8월 11일
0

자바[디자인패턴]

목록 보기
1/3

출처 |https://www.youtube.com/playlist?list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ

디자인 패턴(Design Pattern)

  • 소프트웨어 설계 방법

  • 반복되는 패턴처럼 자주 나타나는 클래스 간의 관계를 맺는 방법이다.

올바른 관계를 맺어야 하는 이유

  1. 클래스는 최소한의 단위 기능을 가짐

  2. 큰 기능은 이러한 단위 기능을 갖는 클래스들 간의 관계를 통해 개발됨

  3. 꼭 필요한 것들만으로 구성된 최적화된 소프트웨어 개발이 용이함

  4. 문제 발생 시 최소한의 코드 수정으로 유지보수가 용이함

  5. 기존 기능에 영향을 주지 않고 새로운 기능 추가가 용이함

GoF의 디자인 패턴

Iterator 패턴

  1. 다양한 Aggregator로 구성된 방법들이 존재하는데, 그 방법을 통일 시킨 방법중에 하나가[통일된 구성데이터를 가져오기 위한 방법중에 하나] Iterator 패턴이다.

  1. Class Diagram은 클래스 간의 관계를 나타낸 다이어그램으로 UML에서 정의한 다이어그램 중 하나다.

  2. 들은 클래스 <-> 인터페이스 간의 관계다.

  3. 동그라미 인터페이스를 의미한다.

  4. 사각형 클래스를 의미한다.

  1. Aggregator 객체가 Iterator 인터페이스 객체를 생성한다 라는 의미다.


1. Aggregator 인터페이스를 Array 에서 구현한다 라는 의미다.


1. 다이아 기호를 갖는 선 ArrayIterator가 Array를 필드로서 갖는다. 라는 의미다.
2. 다이아 표시는 소유의 의미다.
3. 다이아가 채워지지 않았으면, 생명주기를 같이하지 않는다는 의미다.


1. Array가 Item 객체를 필드로서 갖는다는 의미다.
2. 다이아 안이 채워진[검정색] 경우 생명주기를 함께한다 라는 의미다. -> Item객체가 메모리에서 소멸되면/Array도 같이 소멸된다.


1. 이 별표는 Array 클래스가 Item 객체를 여러개 가질 수 있다는 의미다.

Aggregator

package DesignPattern.Iterator;

public interface  Aggregator{
    Iterator iterator();
    // Aggregator 객체는 iterator를 생성한다. 라고 되어 있는데,
}

Iterator

package DesignPattern.Iterator;

public interface Iterator {
    boolean next(); // 다음 구성 데이터를 얻을 수 있다면 true or false
    Object current(); // 구성 데이터를 하나 얻어 반환한다. 구성 데이터 반환은 정해지지 x
}

Array

package DesignPattern.Iterator;


public class Array implements Aggregator {
    private Item[] items;
    public Array(Item[] items)
    {
        this.items = items;
    }
    public Item getItem(int index)
    {
        return items[index];
    }
    public int getCount()
    {
        return items.length;
    }
    @Override
    public Iterator iterator()
    {
        return new ArrayIterator(this);
    }

}

ArrayIterator

package DesignPattern.Iterator;

public class ArrayIterator implements Iterator {
    private Array array;
    private  int index;

    public ArrayIterator(Array array)
    {
        this.array = array;
        this.index = -1;
    }

    @Override
    public boolean next() {
        index++;
        return index < array.getCount();
    }

    @Override
    public Object current() {
        return array.getItem(index);
    }
}

Item

package DesignPattern.Iterator;

public class Item {
    private String name;
    private int cost;

    public Item(String name, int cost) {
        this.name = name;
        this.cost = cost;
    }

    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", cost='" + cost + '\'' +
                '}';
    }
}

MainEntry

package DesignPattern.Iterator;

import DesignPattern.Iterator.Iterator;

public class MainEntry {
    public static void main(String[] args) {
        Item[] items = {
                new Item("CPU", 1000),
                new Item("Keyboard", 3000),
                new Item("Mouse", 5000),
                new Item("HDD", 500)
        };
        Array array = new Array(items); //반복자 생성
        Iterator it = array.iterator();
        while(it.next())
        {
            Item item = (Item)it.current();
            System.out.println(item);
        }
    }
}

코드참조
https://github.com/Ohsaam/IteratorPattern

profile
아는만큼보인다.

0개의 댓글