看一个学校院系展示需求:编写程序展示学校院系结构:需求是这样的,一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系。
----------------**学院--------------------------------
--------法学院------------------------------------------
--------文学院------------------------------------------
对外汉语专业(本科)
汉语言文学专业(本科)
广告学专业(本科)
广播电视编导(本科 艺术类)
播音与主持艺术(本科 艺术类)
语文教育专业(专科)
广告设计与制作专业(专科)
--------计算机与大数据科学学院--------------------------
计算机科学与技术
数据科学与大数据技术
网络工程
软件工程
物联网工程
传统方案学校院系展示图:
传统方案解决学校院系展示问题分析:
- 将学院看做是学校的子类,系是学院的子类实际上是站在组织大小角度来分析问题的。
- 实际上我们的要求是,在一个页面中展示学校的院系组成,一个学校有多个学院,一个学院有多个系!因此这种方案不能很好的实现对学校院系的遍历操作===>迭代器模式。
现在的问题是:计算机学院是系是放在数组中的,信息工程学院系是放在集合中的。通过一个统一的迭代器来完成各个学院系的遍历。
迭代器模式基本介绍:
- 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为设计模式。
- 如果我们的集合是用不同的方式实现的,当客户端要遍历这些集合元素的时候要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器方式解决。
- 迭代器提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示。即不暴露其内部结构。
- 迭代器模式和java中的接口Iterator有关系。
迭代器模式的原理类图:
对原理结构图的说明即(组合模式的角色和职责):
- Iterator:迭代器接口是系统提供,含有的方法为:boolean hasNext()、E next()、void remove()、void forEachRemaining()
- ConcreteIterator:具体的迭代器类,管理迭代。
- Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦。
- ConcreteAggregate:具体的聚合持有对象集合,并提供一个方法返回一个迭代器,该迭代器可以正确的遍历集合。
- Client:客户端,通Iterator和Aggregate来依赖子类。
具体解决方案:
具体代码实现:
迭代器模式在jdk源码中ArrayList的分析:
- jdk源码中,ArrayList就采用了迭代器模式。
- 代码分析+Debug源码。
- URL类图:
角色分析和说明:
- 内部类ArrayList$Itr充当了具体实现迭代器Iterator的类,
- List充当了一个聚合的接口,里面含有了iterator()方法,返回一个迭代器对象。
- ArrayList是实现了聚合接口的List的子类,实现了Iterator()。
- Iterator()接口系统提供。
迭代器模式的细节和注意事项:
- 迭代器模式解决了不同集合(比如说ArrayList、LinkedList)的统一遍历问题。
- 迭代器模式提供统一的方法遍历对象,客户端不再考虑聚合的具体类型,使用一种方法就可以遍历对象了。
- 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不知道聚合的具体构成。
- 提供了一种设计思想,就是一个类应该只有一个引起变化的主因(叫单一职责原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来,集合改变的话只会影响到聚合对象。如果遍历方式改变的话只会影响到迭代器。
- 当要展示一组对象或者遍历一组相同对象时使用。