迭代器模式(Iterator)
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
这种模式在日常开发中很少用,如果是底层设计,说不定会用的上。
- 优点
- 解耦对象行为与遍历行为
- 遍历对象而不暴露其内部接口
- 缺点
- 需要为每一种聚合对象提供其对应的具体遍历器
- 使用场景
- 访问一个聚合对象,而不想暴露其内部表示
- 支持多态迭代(为不同的聚合对象遍历提供一个统一的接口)
实例
角色说明
- Aggregate
- 聚合对象
- ConcreteAggregate
- 具体的聚合对象
- Iterator
- 迭代器接口
- ConcreteIterator
- 具体迭代器
- Client
- 使用者
举例
我们以点仓库为例。
角色说明
- Depository(Aggregate)
- 仓库
- HzDepository(ConcreteAggregate)
- 杭州仓库
- GoodsIterator(Iterator)
- 货物清点器接口
- GoodsIteratorImpl(ConcreteIterator)
- 具体清点器
- Client
- 使用者
uml
code
- Depository.java
public interface Depository {
void add(Goods goods);
void remove(Goods goods);
GoodsIterator getIterator();
}
- HzDepository.java
public class HzDepository implements Depository{
private List<Goods> goodsList;
public HzDepository(List<Goods> goodsList) {
this.goodsList = goodsList;
}
@Override
public void add(Goods goods) {
goodsList.add(goods);
}
@Override
public void remove(Goods goods) {
goodsList.remove(goods);
}
@Override
public GoodsIterator getIterator() {
return new GoodsIteratorImpl(goodsList);
}
}
- GoodsIterator.java
public interface GoodsIterator {
Goods nextGoods();
boolean isLast();
}
- GoodsIteratorImpl.java
public class GoodsIteratorImpl implements GoodsIterator {
private List<Goods> goodsList;
private int index;
public GoodsIteratorImpl(List<Goods> goodsList) {
this.goodsList = goodsList;
}
@Override
public Goods nextGoods() {
Goods goods = goodsList.get(index);
index++;
return goods;
}
@Override
public boolean isLast() {
return index >= goodsList.size();
}
}
- Goods.java
public class Goods {
private String name;
public Goods(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- Client.java
public class Client {
public static void main(String[] args) {
List<Goods> goodsList = Lists.newArrayList(new Goods("mac"), new Goods("iphone"), new Goods("iphone watch"));
//第一次遍历
HzDepository hzDepository = new HzDepository(goodsList);
displayGoods(hzDepository);
//下架iphone watch,第二次遍历
System.out.println("\n下架iphone watch,第二次遍历\n");
hzDepository.remove(goodsList.get(2));
displayGoods(hzDepository);
}
private static void displayGoods(Depository depository) {
GoodsIterator iterator = depository.getIterator();
while (!iterator.isLast()) {
Goods goods = iterator.nextGoods();
System.out.println(goods.getName());
}
}
}
- output
mac
iphone
iphone watch
下架iphone watch,第二次遍历
mac
iphone
实例
code:java.util.ArrayList.Itr
角色说明
- List(Aggregate)
- ArrayList(ConcreteAggregate)
- Iterator(Iterator)
- Itr(ConcreteIterator)
总结
迭代器模式可以遍历一个聚合对象而不暴露其内部具体内容,并且可以为不同的聚合对象提供统一的遍历接口。如果是自定义的数据结构,迭代模式可以参考,一般业务和设计中用不到此模式。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2019-12-22