第十四章、迭代器模式

迭代器模式,又叫做游标模式。是行为型设计模式之中的一个。我们知道对容器对象的訪问必定会涉及遍历算法。我们能够将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现去吧。

这两种情况好像都能够解决这个问题。

然而在前一种情况。容器承受了过多的功能。它不仅要负责自己“容器”内的元素维护(加入、删除等等),并且还要提供遍历自身的接口;并且因为遍历状态保存的问题,不能对同一个容器对象同一时候进行多个遍历。另外一种方式倒是省事,却又将容器的内部细节暴露无遗。

正因于此,迭代器模式应运而生。在客户訪问类与容器体之间插入一个第三者–迭代器,非常好的攻克了上述弊端。

1.定义

提供一种方法顺序訪问一个容器对象中的各个元素,而又不须要暴露该对象的内部表示。

2.使用场景

遍历一个容器对象时。

3.简单实现

用书中的样例:小民和小辉分别在公司两个事业部,某天老板安排任务让他们俩统计一下各自部门的员工数据。

员工实体类:

public class Employee {private String name;// 姓名private int age;// 年龄private String sex;// 性别private String position;// 职位public Employee(String name, int age, String sex, String position) {super();this.name = name;this.age = age;this.sex = sex;this.position = position;}// 简化代码,省略setter和getter方法@Overridepublic String toString() {return "Employee{" + "name='" + name + '\'' + ", age=" + age + ", sex="+ sex + ", position='" + position + '\'' + "}";}
}

小辉部门:

public class CompanyHui {private Employee[] array = new Employee[3];public CompanyHui(){array[0] = new Employee("辉哥", 28, "男", "程序员");array[1] = new Employee("小红", 23, "男", "程序员");array[2] = new Employee("小辉", 25, "男", "程序员");}public Employee[] getEmployees(){return array;}
}

小民部门:

public class CompanyMin {private List<Employee> list = new ArrayList<>();public CompanyMin(){list.add(new Employee("小民", 26, "男", "程序员"));list.add(new Employee("小芸", 22, "女", "測试"));list.add(new Employee("小方", 18, "女", "測试"));list.add(new Employee("可儿", 21, "女", "设计"));list.add(new Employee("朗情", 19, "女", "设计")); //吐槽一下,为什么就小民一个男的,小辉部门全男的。

} public List<Employee> getEmployees(){ return list; } }

Boss查看:

public class Boss {public static void main(String[] args) {CompanyHui hui = new CompanyHui();Employee[] huiList = hui.getEmployees();for(int i = 0; i < huiList.length; i++){System.out.println(huiList[i]);}CompanyMin min = new CompanyMin();List minList = min.getEmployees();for(int i = 0; i < minList.size(); i++){System.out.println(minList.get(i).toString());}}
}

结果:

Employee{name='辉哥', age=28, sex=男, position='程序员'}
Employee{name='小红', age=23, sex=男, position='程序员'}
Employee{name='小辉', age=25, sex=男, position='程序员'}
Employee{name='小民', age=26, sex=男, position='程序员'}
Employee{name='小芸', age=22, sex=女, position='測试'}
Employee{name='小方', age=18, sex=女, position='測试'}
Employee{name='可儿', age=21, sex=女, position='设计'}
Employee{name='朗情', age=19, sex=女, position='设计'}

这样看似也没有问题,可是假设有多个部门,每一个部门有各自的实现,那么我们就要在Boss类中添加一遍遍历逻辑,这样Boss类的功能会越来越多,同一时候暴露了内部细节。那么我们须要定义一个迭代器接口:

public interface Iterator {/*** 是否还有下一个元素 * * @return true表示有,false表示没有*/boolean hasNext();/*** 返回当前元素,并将位置移至下一位*/Object next();
}

小民的迭代器:

public class MinIterator implements Iterator{private List<Employee> list;private int position;public MinIterator(List<Employee> list){this.list = list;}@Overridepublic boolean hasNext() {return !(position > list.size() - 1 || list.get(position) == null);}@Overridepublic Object next() {Employee e = list.get(position);position++;return e;}}

小辉的迭代器:

public class HuiIterator implements Iterator{private Employee[] array;private int position;public HuiIterator(Employee[] array){this.array = array;}@Overridepublic boolean hasNext() {return !(position > array.length - 1 || array[position] == null);}@Overridepublic Object next() {Employee e = array[position];position++;return e;}}

定义容器类的接口

public interface Company {/*** 返回一个迭代器对象* * @return 迭代器对象*/Iterator iterator();}

改动一下之前的两个容器类:

public class CompanyHui implements Company{private Employee[] array = new Employee[3];public CompanyHui(){array[0] = new Employee("辉哥", 28, "男", "程序员");array[1] = new Employee("小红", 23, "男", "程序员");array[2] = new Employee("小辉", 25, "男", "程序员");}public Employee[] getEmployees(){return array;}@Overridepublic Iterator iterator() {return new HuiIterator(array);}
}
public class CompanyMin implements Company{private List<Employee> list = new ArrayList<>();public CompanyMin(){list.add(new Employee("小民", 26, "男", "程序员"));list.add(new Employee("小芸", 22, "女", "測试"));list.add(new Employee("小方", 18, "女", "測试"));list.add(new Employee("可儿", 21, "女", "设计"));list.add(new Employee("朗情", 19, "女", "设计"));}public List<Employee> getEmployees(){return list;}@Overridepublic Iterator iterator() {return new MinIterator(list);}
}

Boss查看:

public class Boss {public static void main(String[] args) {CompanyHui hui = new CompanyHui();check(hui.iterator());CompanyMin min = new CompanyMin();check(min.iterator());}private static void check(Iterator iterator){while (iterator.hasNext()) {System.out.println(iterator.next().toString());}}
}

结果不变,就不反复写了。

4.Android源代码中的模式实现

1.Cursor

当我们使用SQLiteDatabase的query方法查询数据库时。会返回一个Cursor游标对象,该游标的实质就是一个详细的迭代器,我们能够使用它来遍历数据库查询所得的结果集。

5.总结

迭代器模式发展至今。差点儿全部的高级语言都有对应的内置实现,对于开发人员而言,已经极少会自己去实现迭代器了,所以本章内容很多其它的是了解而非应用。

1.长处

(1)符合面向对象设计原则中的单一职责原则。

(2)支持对容器对象的多种遍历。弱化了容器类与遍历算法之间的关系。

2.缺点

(1)类文件的添加。

(3)会出现ConcurrentModificationException异常。

(2)遍历过程是一个单向且不可逆的遍历。

6.參考

● 深入浅出Java设计模式之迭代器模式

● ConcurrentModificationException异常

转载于:https://www.cnblogs.com/zsychanpin/p/7045070.html

《Android源代码设计模式解析与实战》读书笔记(十四)相关推荐

  1. 《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

    当数据具有资产属性之后,数据便可以直接或者间接地为公司.为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易. 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战 ...

  2. 《把时间当作朋友》读书笔记(十四)--积累(二)

    节省与否 有些钱真不能省,否则注定"屌丝"一生,因为这种"节省"可能会伴随有很高的隐性成本,或者将来造成很大的负担----今天看来省了,可将来却要因此付出极大的 ...

  3. How tomcat works 读书笔记十四 服务器组件和服务组件

    之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...

  4. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:// ...

  5. 《Android源码设计模式解析与实战》读书笔记(十三)

    第十三章.备忘录模式 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,有点像是我们平常说的"后悔药". 1.定义 在不破坏封闭的前提下,捕获 ...

  6. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  7. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  8. Spring4实战读书笔记

    Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...

  9. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...

最新文章

  1. RabbitMQ在windows系统安装部署文档
  2. 谷歌搜索没有相机图标_谷歌Pixel 2/3a/4 XL中招!更新安卓11相机崩溃
  3. 【Hibernate】JDBC操作与hibernate的区别
  4. oracle00011,oracle11g 导出表报EXP-00011:table不存在。
  5. 2017《面向对象程序设计》课程作业三
  6. ServerBootstrap
  7. 税收与补贴问题(洛谷-P1023)
  8. vue ---- 数组的常用方法
  9. java B2B2C Springcloud仿淘宝电子商城系统
  10. JavaWeb在线商城系统(java+jsp+servlet+MySQL+jdbc+css+js+jQuery)
  11. Springboot毕业设计毕设作品,微信垃圾分类小程序系统 开题报告
  12. 计算机组成原理画出CPU与主存及3-8译码器之间信号线的连接问题
  13. 全球与中国冷冻莴苣市场深度研究分析报告
  14. 数据基本类型各占几个字节?
  15. 冬季给孩子熬粥有讲究
  16. 综合布线实例详细解决方案
  17. 梅科尔工作室——Django+HarmonyOS实现用户登录
  18. 基于stm32g474高精度定时器HRTIM的移相全桥
  19. 联想NBD白欲立:打造中国最靠谱物联网创业平台
  20. “倚天”一出,谁与争锋?阿里发布首颗云芯片倚天 710,死磕自研芯

热门文章

  1. unique中译_unique 是什么意思_unique 的翻译_音标_读音_用法_例句_爱词霸在线词典...
  2. 电脑小白必备的52个专业术语,有必要了解一下!
  3. 常见专业术语名词解释(持续更新)
  4. beatsx三闪红灯_beatsX耳机维修,beats耳机红灯白灯闪维修,南京beatsX耳机维修
  5. Linux下查看隐藏文件夹
  6. HackerEarth, The Grass Type (dsu on tree)
  7. 数据库逻辑结构设计阶段的4个工作步骤-
  8. 和第三方接口对接总结
  9. 软文写作技巧:文字表达能力是关键
  10. 一幅图片引发的离婚大战