🔍目的
提供一种在不暴露其基础表示的情况下顺序访问聚合对象的元素的方法。
🔍解释
真实世界例子
百宝箱包含一组魔法物品。有多种物品,例如戒指,药水和武器。可以使用藏宝箱提供的迭代器按类型浏览商品。
通俗描述
容器可以提供与表示形式无关的迭代器接口,以提供对元素的访问。
维基百科
在面向对象的编程中,迭代器模式是一种设计模式,其中迭代器用于遍历容器并访问容器的元素。
程序示例
创建含物品的藏宝箱是主要类
public class TreasureChest {
private final List<Item> items;
public TreasureChest() {
items = List.of(
new Item(ItemType.POTION, "Potion of courage"),
new Item(ItemType.RING, "Ring of shadows"),
new Item(ItemType.POTION, "Potion of wisdom"),
new Item(ItemType.POTION, "Potion of blood"),
new Item(ItemType.WEAPON, "Sword of silver +1"),
new Item(ItemType.POTION, "Potion of rust"),
new Item(ItemType.POTION, "Potion of healing"),
new Item(ItemType.RING, "Ring of armor"),
new Item(ItemType.WEAPON, "Steel halberd"),
new Item(ItemType.WEAPON, "Dagger of poison"));
}
public Iterator<Item> iterator(ItemType itemType) {
return new TreasureChestItemIterator(this, itemType);
}
public List<Item> getItems() {
return new ArrayList<>(items);
}
}
public class Item {
private ItemType type;
private final String name;
public Item(ItemType type, String name) {
this.setType(type);
this.name = name;
}
@Override
public String toString() {
return name;
}
public ItemType getType() {
return type;
}
public final void setType(ItemType type) {
this.type = type;
}
}
public enum ItemType {
ANY, WEAPON, RING, POTION
}
创建迭代器接口:
public interface Iterator<T> {
boolean hasNext();
T next();
}
遍历在宝箱中找到的戒指类型物品。
var itemIterator = TREASURE_CHEST.iterator(ItemType.RING);
while (itemIterator.hasNext()) {
LOGGER.info(itemIterator.next().toString());
}
// Ring of shadows
// Ring of armor
🔍类图
🔍适用场景
以下情况使用迭代器模式
- 在不暴露其内部表示的情况下访问聚合对象的内容
- 为了支持聚合对象的多种遍历方式
- 提供一个遍历不同聚合结构的统一接口
🔍Ending
迭代器模式是一种行为设计模式,它允许客户端遍历一个聚合对象中的元素,而不需要暴露聚合对象的内部表示。迭代器模式将遍历聚合对象的责任分离出来,使得聚合对象和遍历算法能够独立变化
希望本文能够帮助读者更深入地理解迭代器模式,并在实际项目中发挥其优势。谢谢阅读!
希望这份博客草稿能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我。