设计模式-迭代器模式

2023-05-04 15:39:47 浏览数 (1)

迭代器模式(Iterator Pattern)是一种行为型设计模式,它可以让我们在不暴露对象实现细节的情况下,访问一个聚合对象中的每一个元素,而无需暴露其内部结构。迭代器模式通过将聚合对象的遍历操作委托给一个迭代器对象来实现这一目标。迭代器模式提供了一种标准的遍历方式,使得我们可以在不改变聚合对象代码的情况下,实现对聚合对象的不同遍历方式。

在迭代器模式中,迭代器对象负责遍历聚合对象,并提供一组标准的遍历操作。聚合对象负责生成相应的迭代器对象,并将迭代器对象传递给客户端。这样,客户端就可以使用迭代器对象遍历聚合对象中的元素,而无需关心聚合对象的内部实现。

在下面的示例中,我们将使用迭代器模式来遍历一个简单的商品列表。我们首先定义一个商品类,它包含商品的名称和价格信息。然后,我们定义一个商品列表类,它包含商品对象的集合。我们将为商品列表类实现一个迭代器对象,该迭代器对象可以用于遍历商品列表中的商品对象。

代码语言:javascript复制
// 商品类
public class Item {
    private String name;
    private double price;
    
    public Item(String name, double price) {
        this.name = name;
        this.price = price;
    }
    
    public String getName() {
        return name;
    }
    
    public double getPrice() {
        return price;
    }
}

// 商品列表类
public class ItemList implements Iterable<Item> {
    private List<Item> items = new ArrayList<>();
    
    public void addItem(Item item) {
        items.add(item);
    }
    
    public void removeItem(Item item) {
        items.remove(item);
    }
    
    public Iterator<Item> iterator() {
        return new ItemListIterator();
    }
    
    // 迭代器类
    private class ItemListIterator implements Iterator<Item> {
        private int currentIndex = 0;
        
        public boolean hasNext() {
            return currentIndex < items.size();
        }
        
        public Item next() {
            return items.get(currentIndex  );
        }
        
        public void remove() {
            items.remove(currentIndex--);
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ItemList itemList = new ItemList();
        itemList.addItem(new Item("item1", 10.0));
        itemList.addItem(new Item("item2", 20.0));
        itemList.addItem(new Item("item3", 30.0));
        
        Iterator<Item> iterator = itemList.iterator();
        while(iterator.hasNext()) {
            Item item = iterator.next();
            System.out.println(item.getName()   ": "   item.getPrice());
        }
    }
}

在上面的示例中,我们首先定义了一个商品类,它包含商品的名称和价格信息。然后,我们定义了一个商品列表类,它包含商品对象的集合。为了实现迭代器模式,我们为商品列表类实现了一个迭代器对象,该迭代器对象可以用于遍历商品列表中的商品对象。这个迭代器对象实现了Iterator接口,并提供了标准的遍历操作:hasNext()、next()和remove()。迭代器对象内部维护了一个当前元素的索引,遍历时每次返回当前元素,并将索引指向下一个元素。如果需要删除当前元素,可以调用remove()方法。由于删除元素会影响到迭代器的遍历,因此需要将索引减1。

在客户端代码中,我们创建了一个商品列表对象,向其中添加了三个商品对象。然后,我们获取商品列表的迭代器对象,并使用while循环遍历商品列表中的所有商品对象。在每次迭代时,我们打印出商品对象的名称和价格信息。

通过上面的示例可以看出,迭代器模式可以将遍历操作从聚合对象中分离出来,从而使得聚合对象的代码更加简洁清晰。此外,迭代器模式也提供了一种标准的遍历方式,可以方便地实现不同的遍历方式。

0 人点赞