【设计模式】迭代器模式

star2017 1年前 ⋅ 733 阅读

简介

提供一个方法,顺序访问集合对象中的各个元素,而不暴露该对象的内部表示,可以把算法和容器进行解耦,应该为聚合对象定义新的遍历操作,而不更改其接口,定义一个单独的(迭代器)对象,它封装对聚合对象的访问和遍历,客户端使用迭代器访问和遍历聚合而不知道其表示形式(数据结构),可以使用不同的迭代器以不同的方式访问和遍历聚合,通过定义新的迭代器,可以独立定义新的访问和遍历操作,该模式属于行为型。

适用场景

1、访问一个集合对象的内容而无需暴露他的内部表示
2、为遍历不同的集合结构提供一个统一的接口

优点

1、分离了集合对象的遍历行为
2、程序进行解耦

缺点

1、增加了类的个数
2、使系统变的复杂

代码示例

image.png
image.png

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实现了该接口,如图代码
image.png
是属于迭代方法,像add、addAll、remove等方法是对集合的操作。

mybatis中应用

DefaultCursor使用了迭代器,CursorIterator是游标迭代器,
image.png
image.png

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: