模式名稱:迭代器模式 Iterator
描述:一個一個遍歷
對代碼的作用:當數據容器內存儲結構發生改變,不必修改客戶端遍歷的代碼
容器接口:
public interface Container<T> {
ContainerIterator<T> iterator();
void add(T element);
}
迭代器接口:
public interface ContainerIterator<T> {
T next(); boolean hasNext();
void setSize(int size); T prev();
}
容器實現:
public class ContainerImpl<T> implements Container<T> {
private Object[] elements;
private int index;
private int size;
private ContainerIterator iterator;
public ContainerImpl() {
elements = new Object[10];
iterator = new ContainerIteratorImpl(elements, size);
}
@Override
public ContainerIterator iterator() {
return iterator;
}
@Override
public void add(T element) {
if(index > 9) {
throw new ArrayIndexOutOfBoundsException();
}
elements[index++] = element;
++size;
iterator.setSize(size);
}
}
迭代器實現:
public class ContainerIteratorImpl<T> implements ContainerIterator<T> {
private int index = 0;
private Object[] elements;
private int size;
public ContainerIteratorImpl(Object[] elements, int size) {
this.elements = elements;
this.size = size;
}
@Override
public T next() {
return (T)elements[index++];
}
@Override
public boolean hasNext() {
return index < size;
}
@Override
public void setSize(int size) {
this.size = size;
}
@Override
public T prev() {
if(index < 1) {
throw new ArrayIndexOutOfBoundsException();
}
return (T) elements[--index];
}
}
容器元素:
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
客戶端:
public class Main {
public static void main(String[] args) {
Container<User> userList = new ContainerImpl<>();
userList.add(new User("小明", 20));
userList.add(new User("小紅", 23));
userList.add(new User("小剛", 12));
userList.add(new User("小離", 24));
ContainerIterator<User> iterator = userList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
UML圖:
總結:當ContainerImpl內部存儲結構改變 我們只需要修改迭代器實現類的實現,而無需修改客戶端代碼,如果只有一兩處修改,修改客戶端沒什么,當使用量特別大的時候,就比較棘手了,只需要修改迭代器實現,一勞永逸