《Android源代码设计模式解析与实战》读书笔记(十四)
第十四章、迭代器模式
迭代器模式,又叫做游标模式。是行为型设计模式之中的一个。我们知道对容器对象的訪问必定会涉及遍历算法。我们能够将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现去吧。
这两种情况好像都能够解决这个问题。
然而在前一种情况。容器承受了过多的功能。它不仅要负责自己“容器”内的元素维护(加入、删除等等),并且还要提供遍历自身的接口;并且因为遍历状态保存的问题,不能对同一个容器对象同一时候进行多个遍历。另外一种方式倒是省事,却又将容器的内部细节暴露无遗。
正因于此,迭代器模式应运而生。在客户訪问类与容器体之间插入一个第三者–迭代器,非常好的攻克了上述弊端。
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源代码设计模式解析与实战》读书笔记(十四)相关推荐
- 《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场
当数据具有资产属性之后,数据便可以直接或者间接地为公司.为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易. 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战 ...
- 《把时间当作朋友》读书笔记(十四)--积累(二)
节省与否 有些钱真不能省,否则注定"屌丝"一生,因为这种"节省"可能会伴随有很高的隐性成本,或者将来造成很大的负担----今天看来省了,可将来却要因此付出极大的 ...
- How tomcat works 读书笔记十四 服务器组件和服务组件
之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...
- 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:// ...
- 《Android源码设计模式解析与实战》读书笔记(十三)
第十三章.备忘录模式 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,有点像是我们平常说的"后悔药". 1.定义 在不破坏封闭的前提下,捕获 ...
- Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记
Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...
- Go语言实战读书笔记
2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...
- Spring4实战读书笔记
Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...
- iPhone与iPad开发实战读书笔记
iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...
最新文章
- RabbitMQ在windows系统安装部署文档
- 谷歌搜索没有相机图标_谷歌Pixel 2/3a/4 XL中招!更新安卓11相机崩溃
- 【Hibernate】JDBC操作与hibernate的区别
- oracle00011,oracle11g 导出表报EXP-00011:table不存在。
- 2017《面向对象程序设计》课程作业三
- ServerBootstrap
- 税收与补贴问题(洛谷-P1023)
- vue ---- 数组的常用方法
- java B2B2C Springcloud仿淘宝电子商城系统
- JavaWeb在线商城系统(java+jsp+servlet+MySQL+jdbc+css+js+jQuery)
- Springboot毕业设计毕设作品,微信垃圾分类小程序系统 开题报告
- 计算机组成原理画出CPU与主存及3-8译码器之间信号线的连接问题
- 全球与中国冷冻莴苣市场深度研究分析报告
- 数据基本类型各占几个字节?
- 冬季给孩子熬粥有讲究
- 综合布线实例详细解决方案
- 梅科尔工作室——Django+HarmonyOS实现用户登录
- 基于stm32g474高精度定时器HRTIM的移相全桥
- 联想NBD白欲立:打造中国最靠谱物联网创业平台
- “倚天”一出,谁与争锋?阿里发布首颗云芯片倚天 710,死磕自研芯
热门文章
- unique中译_unique 是什么意思_unique 的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 电脑小白必备的52个专业术语,有必要了解一下!
- 常见专业术语名词解释(持续更新)
- beatsx三闪红灯_beatsX耳机维修,beats耳机红灯白灯闪维修,南京beatsX耳机维修
- Linux下查看隐藏文件夹
- HackerEarth, The Grass Type (dsu on tree)
- 数据库逻辑结构设计阶段的4个工作步骤-
- 和第三方接口对接总结
- 软文写作技巧:文字表达能力是关键
- 一幅图片引发的离婚大战