迭代器模式:提供一种方法顺序访问一个聚合对象(array、list等)中的各个元素,而又不暴露其内部的表示。
一旦实现迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
有两个系统:绩效查询系统,工资单查询系统。
绩效查询系统(PerformanceSystem),拥有公司所有的员工信息,使用数组实现。
工资查询系统(SalarySystem),拥有公司所有的员工信息,使用List实现。
我们必须使用两个循环遍历这两个系统的人员信息。
使用迭代器模式,使用一种方法就可以访问所有系统的人员信息,而且不需要关心各个系统的人员数据结构。
package com.ez.biz;
/**
* @author 窗外赏雪(EZ编程网)
*/
public class Test {
public static void main(String[] args) {
PerformanceSystem ps = new PerformanceSystem();
SalarySystem ss = new SalarySystem();
Programmer programmer = new Programmer(ps, ss);
System.out.println("======对照系统间的人员信息=====");
programmer.comparePeople();
}
}
package com.ez.biz;
import com.ez.ApplicationSystem;
import com.ez.Iterator;
/**
* 程序员需要隔段时间检查下两个系统的人员数据是否一致。 程序员不需要知道系统是使用数组还是List来实现的,他只关心取到迭代器。
*
* @author 窗外赏雪(EZ编程网)
*/
public class Programmer {
private ApplicationSystem performanceSystem;
private ApplicationSystem salarySystem;
public Programmer(ApplicationSystem performanceSystem,
ApplicationSystem salarySystem) {
this.performanceSystem = performanceSystem;
this.salarySystem = salarySystem;
}
/**
* 对照系统间的人员信息
* 实现迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
*/
public void comparePeople() {
Iterator performanceIterator = performanceSystem.createIterator();
Iterator salaryIterator = salarySystem.createIterator();
System.out.println("绩效系统的人员列表");
printPeople(performanceIterator);
System.out.println("工资系统的人员列表");
printPeople(salaryIterator);
}
private void printPeople(Iterator iterator) {
while (iterator.hasNext()) {
People people = (People) iterator.next();
System.out.println(people.getName());
}
}
}
package com.ez;
/**
* 使用迭代器系统接口
* @author 窗外赏雪(EZ编程网)
*/
public interface ApplicationSystem {
Iterator createIterator();
}
package com.ez.biz;
import com.ez.Iterator;
import com.ez.ApplicationSystem;
import com.ez.impl.ArrayIterator;
/**
* 绩效系统
* 实现创建迭代器,返回数组迭代器。
* @author 窗外赏雪(EZ编程网)
*/
public class PerformanceSystem implements ApplicationSystem{
static final int MAX_COUNT=10;
private People[] peoples;
public PerformanceSystem() {
peoples=new People[MAX_COUNT];
peoples[0]=new People("李四",19);
peoples[1]=new People("王五",24);
peoples[2]=new People("赵六",13);
peoples[3]=new People("孙七",42);
}
public Iterator createIterator(){
return new ArrayIterator(peoples);
}
}
package com.ez.biz;
import java.util.ArrayList;
import java.util.List;
import com.ez.Iterator;
import com.ez.ApplicationSystem;
import com.ez.impl.ListIterator;
/**
* 工资系统
* 实现创建迭代器,返回List迭代器。
* @author 窗外赏雪(EZ编程网)
*/
public class SalarySystem implements ApplicationSystem{
private List<People> peoples;
public SalarySystem() {
peoples=new ArrayList<People>();
peoples.add(new People("李四",19));
peoples.add(new People("王五",24));
peoples.add(new People("赵六",13));
peoples.add(new People("孙七",42));
}
public Iterator createIterator(){
return new ListIterator(peoples);
}
}
package com.ez.biz;
/**
*
* @author 窗外赏雪(EZ编程网)
*/
public class People {
private String name;
private int 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;
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
}
package com.ez;
/**
* 迭代器接口
* @author 窗外赏雪(EZ编程网)
*/
public interface Iterator {
/**
* 是否还有更多的元素
* @return
*/
boolean hasNext();
/**
* 返回下一个元素
* @return
*/
Object next();
}
package com.ez.impl;
import com.ez.Iterator;
import com.ez.biz.People;
/**
* 专门用于迭代数组类型的人员信息。
* @author 窗外赏雪(EZ编程网)
*/
public class ArrayIterator implements Iterator {
private People[] peoples;
private 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 people = peoples[position];
position++;
return people;
}
}
package com.ez.impl;
import java.util.List;
import com.ez.Iterator;
import com.ez.biz.People;
/**
* 专门用于迭代List类型的人员信息。
* @author 窗外赏雪(EZ编程网)
*/
public class ListIterator implements Iterator {
private List<People> peoples;
private int position = 0;
public ListIterator(List<People> peoples) {
this.peoples = peoples;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if (position >= peoples.size() || peoples.get(position) == null) {
return false;
} else {
return true;
}
}
@Override
public Object next() {
People people = peoples.get(position);
position++;
return people;
}
}
使用Java自带的Iterator接口,实现迭代器模式。
package com.ez.biz;
/**
* @author 窗外赏雪(EZ编程网)
*/
public class Test {
public static void main(String[] args) {
PerformanceSystem ps = new PerformanceSystem();
SalarySystem ss = new SalarySystem();
AttendanceSystem as = new AttendanceSystem();
Programmer programmer = new Programmer(ps, ss, as);
System.out.println("======对照系统间的人员信息=====");
programmer.comparePeople();
}
}
package com.ez;
import java.util.Iterator;
/**
* 使用迭代器系统接口
* @author 窗外赏雪(EZ编程网)
*/
public interface ApplicationSystem {
Iterator createIterator();
}
package com.ez.biz;
import java.util.Hashtable;
import java.util.Iterator;
import com.ez.ApplicationSystem;
/**
* 考勤系统
* Collection间接实现了一个返回迭代器的iterator()方法
* @author 窗外赏雪(EZ编程网)
*/
public class AttendanceSystem implements ApplicationSystem{
private Hashtable<String,People> peoples;
public AttendanceSystem() {
peoples=new Hashtable<String,People>();
peoples.put("李四",new People("李四",19));
peoples.put("王五",new People("王五",24));
peoples.put("赵六",new People("赵六",13));
peoples.put("孙七",new People("孙七",42));
}
public Iterator<People> createIterator(){
return peoples.values().iterator();
}
}
package com.ez.biz;
import java.util.Iterator;
import com.ez.ApplicationSystem;
import com.ez.impl.ArrayIterator;
/**
* 绩效系统
* 实现创建迭代器,返回数组迭代器。
* @author 窗外赏雪(EZ编程网)
*/
public class PerformanceSystem implements ApplicationSystem{
static final int MAX_COUNT=10;
private People[] peoples;
public PerformanceSystem() {
peoples=new People[MAX_COUNT];
peoples[0]=new People("李四",19);
peoples[1]=new People("王五",24);
peoples[2]=new People("赵六",13);
peoples[3]=new People("孙七",42);
}
public Iterator createIterator(){
return new ArrayIterator(peoples);
}
}
package com.ez.biz;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.ez.ApplicationSystem;
/**
* 工资系统
* ArrayList已经实现了一个返回迭代器的iterator()方法
* @author 窗外赏雪(EZ编程网)
*/
public class SalarySystem implements ApplicationSystem{
private List<People> peoples;
public SalarySystem() {
peoples=new ArrayList<People>();
peoples.add(new People("李四",19));
peoples.add(new People("王五",24));
peoples.add(new People("赵六",13));
peoples.add(new People("孙七",42));
}
public Iterator<People> createIterator(){
return peoples.iterator();
}
}
package com.ez.impl;
import java.util.Iterator;
import com.ez.biz.People;
/**
* 专门用于迭代数组类型的人员信息,实现java.util的迭代器接口。
* @author 窗外赏雪(EZ编程网)
*/
public class ArrayIterator implements Iterator {
private People[] peoples;
private 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 people = peoples[position];
position++;
return people;
}
@Override
public void remove() {
}
}
package com.ez.biz;
import java.util.Iterator;
import com.ez.ApplicationSystem;
/**
* 程序员需要隔段时间检查下两个系统的人员数据是否一致。
* 程序员不需要知道系统是使用数组还是List来实现的,他只关心取到迭代器。
* @author 窗外赏雪(EZ编程网)
*/
public class Programmer {
private ApplicationSystem performanceSystem;
private ApplicationSystem salarySystem;
private ApplicationSystem attendanceSystem;
public Programmer(ApplicationSystem performanceSystem,
ApplicationSystem salarySystem, ApplicationSystem attendanceSystem) {
this.performanceSystem = performanceSystem;
this.salarySystem = salarySystem;
this.attendanceSystem = attendanceSystem;
}
/**
* 对照系统间的人员信息 实现迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
*/
public void comparePeople() {
Iterator performanceIterator = performanceSystem.createIterator();
Iterator salaryIterator = salarySystem.createIterator();
Iterator attendanceIterator = attendanceSystem.createIterator();
System.out.println("绩效系统的人员列表");
printPeople(performanceIterator);
System.out.println("工资系统的人员列表");
printPeople(salaryIterator);
System.out.println("考勤系统的人员列表");
printPeople(attendanceIterator);
}
private void printPeople(Iterator iterator) {
while (iterator.hasNext()) {
People people = (People) iterator.next();
System.out.println(people.getName());
}
}
}
Collection和Iterator的好处在于,每个Collection都知道如何创建自己的Iterator。例如,只要调用ArrayList上的iterator(),就可以返回一个具体的Iterator。
Java5 包含一种新形式的for语句,称为for/in。可以让你在一个集合或者一个数组中遍历,而不需要显式创建迭代器。
程序员调了三次createIterator(),printPeople(Iterator)。
我们可以把这些系统打包进一个List中,然后取到它的迭代器,遍历每个系统,这样,程序员代码就变得很简单,并且新增删除应用都不用修改代码。
优化后的程序员代码:
package com.ez.biz;
import java.util.Iterator;
import java.util.List;
import com.ez.ApplicationSystem;
/**
* 程序员升级版
* 我们把系统打包进一个List中,这样我们可以通过迭代器,遍历每个系统。
* @author 窗外赏雪(EZ编程网)
*/
public class ProgrammerUpgrade {
private List<ApplicationSystem> applicationSystems;
public ProgrammerUpgrade(List<ApplicationSystem> applicationSystem) {
this.applicationSystems=applicationSystem;
}
/**
* 对照系统间的人员信息 实现迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
*/
public void comparePeople() {
Iterator systemIterator = applicationSystems.iterator();
while(systemIterator.hasNext()){
ApplicationSystem as=(ApplicationSystem)systemIterator.next();
System.out.println("=============================");
printPeople(as.createIterator()); //每个系统的迭代器
}
}
private void printPeople(Iterator iterator) {
while (iterator.hasNext()) {
People people = (People) iterator.next();
System.out.println(people.getName());
}
}
}