Iterator pattern은 collection 객체의 element들을 traverse하기 위한 기능을 collection 객체와 독립적으로 구현하는 방법. (=객체 지향 프로그래밍에서 iterator를 사용하여 container를 가로지르며 요소들에 접근하는 패턴.)
컬렉션 객체 - 배열, ArrayList, Stack, LinkedList, HashMap등 라이브러리에 있는 Iterator 객체를 구현하는 예제
특징 : Iterator 패턴은 container로부터 알고리즘을 분리시키며, 일부의 경우 알고리즘들은 필수적으로 container에 특화되어 있기 때문에 분리가 불가능하다함. / 유연하고 재사용 가능한 객체지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법.
Iterator 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것. aggregate 유형에 무관한 동일 순차 방법 제공, 여기서 aggregate는 collection이나 container와 같다 + Iterator 객체를 생성하기 위한 인터페이스를 정의하는 것이고 iterator란 요소에 접근 할수 있고 순회할 수 있는 인터페이스를 정의하는 것임.
import java.util.*;
interface XCollection
{
public XIterator createIterator();
}
interface XIterator
{
public boolean hasNext();
public Object next();
}
class ArrayListIterator implements XIterator
{
ArrayList<String> list;
int index;
ArrayListIterator(ArrayList<String> list) {
this.list = list;
index = 0;
}
public boolean hasNext(){
if (index < list.size())
{
return true;
}
return false;
}
public String next(){
String obj = list.get(index);
index++;
return obj;
}
}
class ArrayIterator implements XIterator
{
Object[] array;
int index;
ArrayIterator(Object[] array) {
this.array = array;
index = 0;
}
public boolean hasNext(){
if (index >= array.length) return false;
if (array[index] == null) return false;
return true;
}
public Object next(){
Object o = array[index];
index++;
return o;
}
}
class DinnerMenu implements XCollection
{
static int MAX = 10;
int n = 0;
String[] menuItems;
DinnerMenu() {
menuItems = new String[MAX];
menuItems[n++] = "짜장";
menuItems[n++] = "짬뽕";
menuItems[n++] = "우동";
menuItems[n++] = "라면";
}
String[] getMenuItems() {
return menuItems;
}
public XIterator createIterator() {
return new ArrayIterator(menuItems);
}
}
class PancakeHouseMenu implements XCollection
{
ArrayList<String> menuItems;
PancakeHouseMenu() {
menuItems = new ArrayList<String>();
menuItems.add("AAA pancake");
menuItems.add("BBB pancake");
menuItems.add("CCC pancake");
}
ArrayList<String> getMenuItems() {
return menuItems;
}
public XIterator createIterator() {
return new ArrayListIterator(menuItems);
}
}
class IteratorTest
{
static void printMenu(XCollection menu) {
XIterator i = menu.createIterator();
while(i.hasNext()) {
Object obj = i.next();
System.out.println(obj);
}
}
public static void main(String[] args)
{
DinnerMenu menu1 = new DinnerMenu();
PancakeHouseMenu menu2 = new PancakeHouseMenu();
printMenu(menu1);
printMenu(menu2);
/* String l1[] = menu1.getMenuItems();
ArrayList<String> l2 = menu2.getMenuItems();
for (int i = 0; i < l1.length; i++)
{
if (l1[i] != null)
{
System.out.println(l1[i]);
}
}
for (int i = 0; i < l2.size(); i++)
{
System.out.println(l2.get(i));
} */
}
}
'Design Pattern' 카테고리의 다른 글
디자인 패턴 - Composite Pattern (0) | 2022.04.16 |
---|---|
디자인 패턴 - Template Method pattern (0) | 2022.04.12 |
디자인 패턴 - Facade pattern (0) | 2022.04.12 |
디자인 패턴 - adapter pattern (0) | 2022.04.10 |
디자인 패턴 - 커멘드 패턴 (0) | 2022.04.08 |
댓글