简介
提供一个方法,顺序访问集合对象中的各个元素,而不暴露该对象的内部表示,可以把算法和容器进行解耦,应该为聚合对象定义新的遍历操作,而不更改其接口,定义一个单独的(迭代器)对象,它封装对聚合对象的访问和遍历,客户端使用迭代器访问和遍历聚合而不知道其表示形式(数据结构),可以使用不同的迭代器以不同的方式访问和遍历聚合,通过定义新的迭代器,可以独立定义新的访问和遍历操作,该模式属于行为型。
适用场景
1、访问一个集合对象的内容而无需暴露他的内部表示
2、为遍历不同的集合结构提供一个统一的接口
优点
1、分离了集合对象的遍历行为
2、程序进行解耦
缺点
1、增加了类的个数
2、使系统变的复杂
代码示例
public class Order {
private String name;
public Order(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
订单聚合接口
public interface OrderAggregate {
void addOrder(Order order);
void removeOrder(Order order);
OrderIterator getOrderIterator();
}
订单聚合实现类
public class OrderAggregateImpl implements OrderAggregate {
private List orderList;
public OrderAggregateImpl() {
this.orderList = new ArrayList();
}
public void addOrder(Order order) {
orderList.add(order);
}
public void removeOrder(Order order) {
orderList.remove(order);
}
public OrderIterator getOrderIterator() {
return new OrderIteratorImpl(orderList);
}
}
订单迭代接口
public interface OrderIterator {
Order nextOrder();
boolean isLastOrder();
}
订单迭代实现类
public class OrderIteratorImpl implements OrderIterator{
private List orderList;
private int position;
private Order order;
public OrderIteratorImpl(List orderList) {
this.orderList = orderList;
}
public Order nextOrder() {
System.out.println("订单位置: "+position);
order = (Order) orderList.get(position);
position++;
return order;
}
public boolean isLastOrder() {
return position >= orderList.size();
}
}
测试类
public class IteratorTest {
public static void main(String[] args) {
Order order1 = new Order("订单1");
Order order2 = new Order("订单2");
Order order3 = new Order("订单3");
Order order4 = new Order("订单4");
OrderAggregate orderAggregate = new OrderAggregateImpl();
orderAggregate.addOrder(order1);
orderAggregate.addOrder(order2);
orderAggregate.addOrder(order3);
orderAggregate.addOrder(order4);
OrderIterator orderIterator = orderAggregate.getOrderIterator();
while (!orderIterator.isLastOrder()){
Order orderDb = orderIterator.nextOrder();
System.out.println(orderDb.getName());
}
}
}
输出结果为:
订单位置: 0
订单1
订单位置: 1
订单2
订单位置: 2
订单3
订单位置: 3
订单4
源码分析
jdk中应用
Iterator
接口是jdk的迭代器,如ArrayList
实现了该接口,如图代码
是属于迭代方法,像add、addAll、remove等方法是对集合的操作。
mybatis中应用
DefaultCursor
使用了迭代器,CursorIterator
是游标迭代器,
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载