设计模式---迭代器模式

迈不过友情╰ 2022-11-26 10:55 445阅读 0赞

目录

1、具体需求

2、传统的设计方案

3、传统方式的问题分析

4、迭代器模式基本介绍

5、迭代器模式原理类图

6、迭代器模式应用实例

7、迭代器模式在JDK-ArrayList中的应用

8、迭代器模式注意事项及细节


1、具体需求

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

20200811233842711.png

2、传统的设计方案

20200811233856494.png

3、传统方式的问题分析

  • 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
  • 实际上我们要求的是:在一个页面中展示出学校的院系组成,一个学校有多少个学院,一个学院有多少个系,因此这种方案,不能很好的实现遍历
  • 解决方案:迭代器模式。

4、迭代器模式基本介绍

  • 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为设计模式
  • 如果我们的集合元素是不同的方式实现的,有数组,还有java对象集合类,或者是其它方式,这时候当我们需要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式进行设计。
  • 迭代器模式:提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即不暴露内部结构。

5、迭代器模式原理类图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5ajEwODMxNw_size_16_color_FFFFFF_t_70

  • Iterator: 迭代器接口,由系统提供,含有hasNext,next,remove方法;
  • ConcreteIterator: 具体的迭代器类,管理迭代
  • Aggregate: 一个统一的聚合接口,将客户端和具体聚合解耦;
  • ConcreteAggregate:具体聚合持有对象的集合,并提供一个方法,返回迭代器,该迭代器可以正确遍历集合

6、迭代器模式应用实例

完成上面的院系需求。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5ajEwODMxNw_size_16_color_FFFFFF_t_70 1

代码:

  1. package com.mayun.study.designpattern.iterator;
  2. /**
  3. * 系
  4. */
  5. public class Department {
  6. private String name;
  7. private String desc;
  8. public Department(String name, String desc) {
  9. this.name = name;
  10. this.desc = desc;
  11. }
  12. public String getDesc() {
  13. return desc;
  14. }
  15. public void setDesc(String desc) {
  16. this.desc = desc;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }
  25. package com.mayun.study.designpattern.iterator;
  26. import java.util.Iterator;
  27. /**
  28. * 迭代器
  29. */
  30. public class ComputerCollegeIterator implements Iterator {
  31. //这里我们需要知道Department是以怎么样的方式存放的
  32. Department[] departments;
  33. int position = 0;//遍历的位置
  34. //构造器
  35. public ComputerCollegeIterator(Department[] departments) {
  36. this.departments = departments;
  37. }
  38. /**
  39. * 判断是否含有下一个
  40. * @return
  41. */
  42. @Override
  43. public boolean hasNext() {
  44. if (position >= departments.length || departments[position] == null) {
  45. return false;
  46. }else{
  47. return true;
  48. }
  49. }
  50. @Override
  51. public Department next() {
  52. Department department = departments[position];
  53. position +=1;
  54. return department;
  55. }
  56. @Override
  57. public void remove() {
  58. //默认空实现
  59. }
  60. }
  61. package com.mayun.study.designpattern.iterator;
  62. import java.util.Iterator;
  63. import java.util.List;
  64. public class InfoCollegeIterator implements Iterator {
  65. List<Department> departments;//信息工程学院是以list的形势存放的
  66. int index = -1;
  67. public InfoCollegeIterator(List<Department> departments) {
  68. this.departments = departments;
  69. }
  70. @Override
  71. public boolean hasNext() {
  72. if (index >= departments.size() - 1) {
  73. return false;
  74. }else{
  75. index +=1;
  76. return true;
  77. }
  78. }
  79. @Override
  80. public Object next() {
  81. return departments.get(index);
  82. }
  83. @Override
  84. public void remove() {
  85. }
  86. }
  87. package com.mayun.study.designpattern.iterator;
  88. import java.util.Iterator;
  89. /**
  90. * 学院接口
  91. */
  92. public interface College {
  93. //获得名称
  94. public String getName();
  95. //增加系
  96. public void addDepartment(String name, String desc);
  97. //返回一个迭代器 遍历
  98. public Iterator createIterator();
  99. }
  100. package com.mayun.study.designpattern.iterator;
  101. import java.util.Iterator;
  102. /**
  103. * 聚合类
  104. */
  105. public class ComputerCollege implements College {
  106. Department[] departments;
  107. int numOfDepartment = 0;//保存当前数组的对象个数
  108. public ComputerCollege(){
  109. departments = new Department[5];
  110. addDepartment("java专业","java");
  111. addDepartment("大数据专业","大数据");
  112. addDepartment("C专业","C");
  113. }
  114. @Override
  115. public String getName() {
  116. return "计算机学院";
  117. }
  118. @Override
  119. public void addDepartment(String name, String desc) {
  120. Department department = new Department(name,desc);
  121. departments[numOfDepartment++] = department;
  122. }
  123. @Override
  124. public Iterator createIterator() {
  125. return new ComputerCollegeIterator(departments);
  126. }
  127. }
  128. package com.mayun.study.designpattern.iterator;
  129. import java.util.ArrayList;
  130. import java.util.Iterator;
  131. import java.util.List;
  132. /**
  133. * 聚合类
  134. */
  135. public class InfoCollege implements College {
  136. List<Department> departmentList;
  137. public InfoCollege(){
  138. departmentList = new ArrayList<>();
  139. addDepartment("电信专业","电信");
  140. addDepartment("多媒体专业","多媒体");
  141. addDepartment("移动专业","移动");
  142. }
  143. @Override
  144. public String getName() {
  145. return "信息学院";
  146. }
  147. @Override
  148. public void addDepartment(String name, String desc) {
  149. Department department = new Department(name,desc);
  150. departmentList.add(department);
  151. }
  152. @Override
  153. public Iterator createIterator() {
  154. return new InfoCollegeIterator(departmentList);
  155. }
  156. }
  157. package com.mayun.study.designpattern.iterator;
  158. import java.util.Iterator;
  159. import java.util.List;
  160. /**
  161. * 统一输出类
  162. */
  163. public class OutPutImpl {
  164. //学院集合
  165. List<College> collegeList;
  166. public OutPutImpl(List<College> collegeList) {
  167. this.collegeList = collegeList;
  168. }
  169. //遍历所有学院,然后输出各个学院中的系
  170. public void printCollege(){
  171. Iterator<College> collegeIterator = collegeList.iterator();
  172. while (collegeIterator.hasNext()) {
  173. College college = collegeIterator.next();
  174. System.out.println("--------------学院的名称:"+college.getName()+"------------------");
  175. printDepartment(college.createIterator());
  176. }
  177. }
  178. //输出学院中的系
  179. public void printDepartment(Iterator iterator) {
  180. while (iterator.hasNext()) {
  181. Department a = (Department)iterator.next();
  182. System.out.println(a.getName());
  183. }
  184. }
  185. }
  186. package com.mayun.study.designpattern.iterator;
  187. import java.util.ArrayList;
  188. import java.util.List;
  189. /**
  190. * 迭代模式测试类
  191. */
  192. public class Client {
  193. public static void main(String[] args) {
  194. List<College> collegeList = new ArrayList<>();
  195. ComputerCollege computerCollege = new ComputerCollege();
  196. collegeList.add(computerCollege);
  197. InfoCollege infoCollege = new InfoCollege();
  198. collegeList.add(infoCollege);
  199. OutPutImpl outPut = new OutPutImpl(collegeList);
  200. outPut.printCollege();
  201. }
  202. }

7、迭代器模式在JDK-ArrayList中的应用

JDK的ArrayList中就使用了迭代器模式。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5ajEwODMxNw_size_16_color_FFFFFF_t_70 2

20200811235345774.png

8、迭代器模式注意事项及细节

优点:

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

缺点:

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

发表评论

表情:
评论列表 (有 0 条评论,445人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-模式

    > 迭代器模式结构图 意图:提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。  ![watermar

    相关 设计模式- 模式

    设计模式 - 迭代器模式 场景 小张的朋友开了一家酒店,最近新收购了一家庭旅馆。需要对自己酒店的房间和家庭旅馆的房间进行统一管理,但是两家之间都有各自的实现存储房间

    相关 设计模式——模式

    迭代器模式定义 提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 使用场景 循环打印一个字符串集合,里面就用到了迭代器模式,迭代器的作用就是将