目录
迭代器模式(Iterator Pattern)
定义
提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。
意义
- 这个模式提供一个方法可以遍历聚合对象中的元素,而又不用知道内部的具体实现方式
- 把游走的任务放在迭代器上而不是聚合上,简化了聚合的接口和实现
类图
实现例子
对象
package iterator;
/**
* 对象类
*/
public class People {
private String name;
private int age;
public People(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;
}
}
聚合类
package iterator;
/**
* 聚合类的接口
* 实现createIterator()方法返回一个迭代器
*/
public interface Aggregate {
Iterator createIterator();
}
package iterator;
/**
* 用数组实现聚合
*/
public class ArrayAggregate implements Aggregate {
static final int MAX_SiZE = 6;
int index = 0;
People[] peoples;
public ArrayAggregate() {
peoples = new People[MAX_SiZE];
addPeople("jack", 20);
addPeople("hp", 20);
addPeople("rose", 21);
}
public void addPeople(String name, int age) {
People people = new People(name, age);
if(index >= MAX_SiZE){
System.out.println("该集合不能再加人了!");
} else{
peoples[index] = people;
index = index + 1;
}
}
@Override
public Iterator createIterator() {
return new ArrayIterator(peoples);
}
}
package iterator;
import java.util.ArrayList;
/**
* 用ArrayList实现聚合
*/
public class ListAggregate implements Aggregate {
ArrayList peoples;
public ListAggregate() {
peoples = new ArrayList();
addPeople("jack", 20);
addPeople("hp", 20);
addPeople("rose", 21);
}
public void addPeople(String name, int age) {
People people = new People(name, age);
peoples.add(people);
}
@Override
public Iterator createIterator() {
return new ListIterator(peoples);
}
}
迭代器部分
package iterator;
/**
* 迭代器接口
*/
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
package iterator;
/**
* 数组的迭代器,数组不支持迭代器,这里只能自定义一个
*/
public class ArrayIterator implements Iterator {
People[] peoples;
int position = 0;
public ArrayIterator(People[] peoples) {
this.peoples = peoples;
}
@Override
public boolean hasNext() {
if(position >= peoples.length || peoples[position] == null){
return false;
} else{
return true;
}
}
@Override
public Object next() {
People p = peoples[position];
position = position + 1;
return p;
}
@Override
public void remove() {
if(position <= 0){
System.out.println("不能移除,下标超过下界");
}
if(peoples[position-1] != null){
for(int i = position - 1; i < peoples.length - 1; i++){
peoples[i] = peoples[i+1];
}
peoples[peoples.length - 1] = null;
}
}
}
package iterator;
import java.util.ArrayList;
/**
* ArrayList的迭代器
* ArrayList内部其实已经有了迭代器(java.util.Iterator),这里我们仍然自己实现一个
*/
public class ListIterator implements Iterator {
ArrayList peoples;
int position = 0;
public ListIterator(ArrayList peoples) {
this.peoples = peoples;
}
@Override
public boolean hasNext() {
if(position >= peoples.size()){
return false;
} else{
return true;
}
}
@Override
public Object next() {
Object object = peoples.get(position);
position = position + 1;
return object;
}
@Override
public void remove() {
if(position <= 0){
System.out.println("不能移除,下标超过下界");
} else{
peoples.remove(position);
}
}
}
客户
package iterator;
import java.awt.print.Printable;
public class Client {
Aggregate array;
Aggregate list;
public Client(Aggregate array, Aggregate list) {
this.array = array;
this.list = list;
}
// 打印集合里面所有人的信息
public void PrintAllInfo() {
Iterator arrayIterator = array.createIterator();
Iterator listIterator = list.createIterator();
System.out.println("数组里面的所有人");
printPeoples(arrayIterator);
System.out.println("ArrayList里面的所有人");
printPeoples(listIterator);
}
private void printPeoples(Iterator iterator) {
while(iterator.hasNext()){
People p = (People) iterator.next();
System.out.println("姓名:"+p.getName()+" 年龄:"+p.getAge());
}
}
}
测试
package iterator;
public class Test {
public static void main(String[] args) {
ArrayAggregate array = new ArrayAggregate();
ListAggregate list = new ListAggregate();
Client c = new Client(array, list);
c.PrintAllInfo();
}
}