设计模式:迭代器模式(Iterator)

来源:互联网 发布:如何筛选excel数据求和 编辑:程序博客网 时间:2024/06/03 19:15

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。又称游标(Cursor)模式。 
这里写图片描述

迭代器模式角色组成: 
1. 抽象容器角色(Aggregate):负责提供创建具体迭代器角色的接口,一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。 
2. 具体容器角色(ConcreteAggregate):就是实现抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList,Set接口的哈希列表的实现HashSet等。 
3. 抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口。 
4. 具体迭代器角色(ConcreteIterator):实现迭代器接口,并要记录遍历中的当前位置。

举个简单案例 
1 Iterator

public interface Iterator{    public Object next();    public boolean hasNext();}
  • 1
  • 2
  • 3
  • 4
  • 5

2 ConcreteIterator

public class ConcreteIterator implements Iterator{    private List<Object> list = Collections.emptyList();    private int current = 0;    public ConcreteIterator(List<Object> list)    {        this.list = list;    }    @Override    public Object next()    {        Object obj = null;        if(this.hasNext())        {            obj = this.list.get(current++);        }        return obj;    }    @Override    public boolean hasNext()    {        if(current == list.size())        {            return false;        }        return true;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

3 Aggregate

public interface Aggregate{    public void add(Object obj);    public void remove(Object obj);    public Iterator iterator();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4 ConcreteAggregate

public class ConcreteAggregate implements Aggregate{    private List<Object> list = new ArrayList<>();    @Override    public void add(Object obj)    {        list.add(obj);    }    @Override    public void remove(Object obj)    {        list.remove(obj);    }    @Override    public Iterator iterator()    {        return new ConcreteIterator(list);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

5 测试代码

        Aggregate ag = new ConcreteAggregate();        ag.add("zzh");        ag.add("jj");        ag.add("qq");        Iterator it = ag.iterator();        while(it.hasNext())        {            System.out.println(it.next());        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出:

zzhjjqq
  • 1
  • 2
  • 3

优缺点 
优点:

  1. 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引人了迭代器方法后,用户用起来就简单的多了。
  2. 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
  3. 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

缺点:

  1. 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,比如ArrayList,用for循环的方式遍历会更好一点,详细可以参考《Java集合框架:ArrayList》

适用场景 
 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List,Set,Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。但是,由于容器与迭代器的关系太密切了,所以大多数语言在实现容器的时候都给提供了迭代器,并且这些语言提供的容器和迭代器在绝大多数情况下就可以满足我们的需要,所以现在需要我们自己取实践迭代器模式的场景还是比较少见的,我们只需要使用语言中已有的容器和迭代器就可以了。


参考资料 
1. 《23种设计模式》 
2. 《23种设计模式(13):迭代器模式》 
3. 《Java集合框架:ArrayList》

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办 身份证被偷了怎么办啊 苹果手机wifi速度慢怎么办 电脑桌面上的图标不见了怎么办 夏天手机没地方放怎么办 上班手机没地方放怎么办 京东退款未到账怎么办 京东退款失败后怎么办 在京东申请退款怎么办 微信退款没收到钱怎么办 在拼多多不发货怎么办 扫二维码群发微信骗局怎么办 电脑高清晰音频管理器打不开怎么办 吃鸡耳机有杂音怎么办 分期付款车被朋友卖了怎么办 网上购物付款显示繁忙怎么办 同行招牌高于我的招牌怎么办 拼多多刷手退款怎么办 网银卡在手机上卸载了怎么办 企业网银密码忘了怎么办 网银钱转错了怎么办 民生百货购物卡过期了怎么办 新办卡注册过支付宝账号怎么办 床上用品专卖店没人进店怎么办 红蚂蚁咬了红肿痒怎么办 碎纸机轮不转了怎么办 轮滑鞋刀架螺丝圆了了怎么办 万朋商城2018年怎么办 超市盘点少了烟怎么办 歌华有线电视费用欠费好久怎么办 租房到期房东不退押金怎么办