设计模式之迭代器模式
迭代器的存在是为了遍历数据,但是如何遍历的细节却被隐藏起来。下面先看一段简单的代码:
public class Iterator_01 {
static class Item{
private String name;
public Item(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static void main(String[] args) {
Item[] itemArr = {new Item("1"),new Item("2"),new Item("3")};
for (int i = 0; i < itemArr.length; i++) {
System.out.println(itemArr[i].getName());
}
}
}
这段代码是普通的数组遍历的代码,但是是否继续遍历,是依赖for循环,且显示的获取其中的元素。而迭代器模式却是将访问的细节进行封装,看一段自己实现的迭代器:
public class Iterator_02 {
static class Item{
private String name;
public Item(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
interface MyIterator<E>{
boolean hasNext();
E next();
}
static class MyList<E> {
Object[] arr;
int count=0;
int pointer = 0;
public MyList(int capacity) {
arr = new Object[capacity];
}
public void add(E e){
arr[count]=e;
count++;
}
public Iterator_02.MyIterator<E> iterator() {
return new MyIterator();
}
class MyIterator implements Iterator_02.MyIterator<E> {
@Override
public boolean hasNext() {
if (count > 0 && pointer < count) {
return true;
}
return false;
}
@Override
public E next() {
E element = (E) arr[pointer];
pointer++;
return element;
}
}
}
public static void main(String[] args) {
MyList<Item> myList = new MyList<>(4);
myList.add(new Item("1"));
myList.add(new Item("2"));
myList.add(new Item("3"));
MyIterator<Item> iterator = myList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next().getName());
}
}
}
这里只是一个简单的实现,可以参考java的ArrayList中Itr内类的实现方式。
下面来看看迭代器模式的定义:提供一种方法访问一个容器对象中各个元素,而又不需要暴露改对象的内部细节。
总结:
该设计模式基本上不会自己去实现,java中的容器都已经实现了改设计模式,可以直接使用。