设计模式--迭代器模式

看一个学校院系展示需求:编写程序展示学校院系结构:需求是这样的,一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系。

----------------**学院--------------------------------

--------法学院------------------------------------------

--------文学院------------------------------------------

对外汉语专业(本科)

汉语言文学专业(本科)

广告学专业(本科)

广播电视编导(本科 艺术类)

播音与主持艺术(本科 艺术类)

语文教育专业(专科)

广告设计与制作专业(专科)

--------计算机与大数据科学学院--------------------------

计算机科学与技术

数据科学与大数据技术

网络工程

软件工程

物联网工程

传统方案学校院系展示图:

传统方案解决学校院系展示问题分析:

  1. 将学院看做是学校的子类,系是学院的子类实际上是站在组织大小角度来分析问题的。
  2. 实际上我们的要求是,在一个页面中展示学校的院系组成,一个学校有多个学院,一个学院有多个系!因此这种方案不能很好的实现对学校院系的遍历操作===>迭代器模式。

现在的问题是:计算机学院是系是放在数组中的,信息工程学院系是放在集合中的。通过一个统一的迭代器来完成各个学院系的遍历。

迭代器模式基本介绍:

  1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为设计模式。
  2. 如果我们的集合是用不同的方式实现的,当客户端要遍历这些集合元素的时候要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器方式解决。
  3. 迭代器提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。即不暴露其内部结构。
  4. 迭代器模式和java中的接口Iterator有关系。

迭代器模式的原理类图:

对原理结构图的说明即(组合模式的角色和职责):

  1. Iterator:迭代器接口是系统提供,含有的方法为:boolean hasNext()、E next()、void remove()、void forEachRemaining()
  2. ConcreteIterator:具体的迭代器类,管理迭代。
  3. Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦。
  4. ConcreteAggregate:具体的聚合持有对象集合,并提供一个方法返回一个迭代器,该迭代器可以正确的遍历集合。
  5. Client:客户端,通Iterator和Aggregate来依赖子类。

具体解决方案:

具体代码实现:

迭代器模式在jdk源码中ArrayList的分析:

  1. jdk源码中,ArrayList就采用了迭代器模式。
  2. 代码分析+Debug源码。

  1. URL类图:

角色分析和说明:

  • 内部类ArrayList$Itr充当了具体实现迭代器Iterator的类,
  • List充当了一个聚合的接口,里面含有了iterator()方法,返回一个迭代器对象。
  • ArrayList是实现了聚合接口的List的子类,实现了Iterator()。
  • Iterator()接口系统提供。

迭代器模式的细节和注意事项:

  1. 迭代器模式解决了不同集合(比如说ArrayList、LinkedList)的统一遍历问题。
  2. 迭代器模式提供统一的方法遍历对象,客户端不再考虑聚合的具体类型,使用一种方法就可以遍历对象了。
  3. 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不知道聚合的具体构成。
  4. 提供了一种设计思想,就是一个类应该只有一个引起变化的主因(叫单一职责原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来,集合改变的话只会影响到聚合对象。如果遍历方式改变的话只会影响到迭代器。
  5. 当要展示一组对象或者遍历一组相同对象时使用。

缺点:每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值