版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么实现迭代器模式
这期内容当中在下将会给大家带来有关Android中怎么实现迭代器模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、介绍迭代器模式(IteratorPattern)又称为游标(Cursor)模式,是行为型设计模式之一。迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List、Map、数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法。如果我们将遍历的方法封装到容器中,那么对于容器类来说就承担了过多的功能,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,因为遍历状态的存储问题还不能对同一个容器同时进行多个遍历操作,如果我们不提供遍历方法而让使用者自己去实现,又会让容器的内部细节暴露无遗,正因于此,迭代模式应运而生,在客户访问类与容器体之间插入了一个第三者——迭代器,很好地解决了上面所述的弊端。二、定义提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。三、使用场景遍历一个容器对象。四、迭代器模式的UML类图UML类图:通用模式代码:迭代器接口:public
interface
Iterator<T>
{
/**
*
是否还有下一个元素
*
@return
true表示有,false表示没有
**/
boolean
hasNext();
/**
*
返回当前位置的元素并将位置移至下一位
**/
T
next();
}具体迭代器类:public
class
ConcreteIterator<T>
implements
Iterator<T>{
private
List<T>
list;
private
int
cursor
=
0;
public
ConcreteIterator(List<T>
list)
{
this.list
=
list;
}
@Override
public
boolean
hasNext()
{
return
cursor
!=
list.size();
}
@Override
public
T
next()
{
T
obj
=
null;
if
(this.hasNext())
{
obj
=
this.list.get(cursor++);
}
return
obj;
}
}容器接口:public
interface
Aggregation<T>
{
/**
*
添加一个元素
**/
void
add(T
obj);
/**
*
移除一个元素
**/
void
remove(T
obj);
/**
*
获取容器的迭代器
**/
Iterator<T>
iterator();
}具体容器类:public
class
ConcreteAggregation<T>
implements
Aggregation<T>{
private
List<T>
list
=
new
ArrayList<>();
@Override
public
void
add(T
obj)
{
list.add(obj);
}
@Override
public
void
remove(T
obj)
{
list.remove(obj);
}
@Override
public
Iterator<T>
iterator()
{
return
new
ConcreteIterator<>(list);
}
}客户类:public
class
Client
{
public
static
void
main(String
args[])
{
Aggregation<String>
a
=
new
ConcreteAggregation<>();
a.add("a");
a.add("b");
a.add("c");
Iterator<String>
iterator
=
a.iterator();
while
(iterator.hasNext())
{
System.out.print(iterator.next());
}
}
}角色介绍:Iterator:迭代器接口,迭代器接口负责定义、访问和遍历元素的接口。ConcreteIterator:具体迭代器类,具体迭代器类的目的主要是实现迭代器接口,并记录遍历的当前位置。Aggregate:容器接口,容器接口负责提供创建具体迭代器角色的接口。ConcreteAggregate:具体容器类,具体迭代器角色与该容器相关联。Client:客户类。五、简单实现小民和小辉分别在公司的两个事业部,某天老板安排任务让他们俩统计一下各自部门的员工数据,这很好办嘛,建一个类用数据结构把所有员工数据存进去即可,老板要看的时候给他用for循环实现,还是比较容易的,下面就先为员工创建一个实体类:员工实体类: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();
=
name;
this.age
=
age;
this.sex
=
sex;
this.position
=
position;
}
//
简化代码,省略setter和getter方法
@Override
public
String
toString()
{
return
"Employee{"
+
"name='"
+
name
+
'\''
+
",
age="
+
age
+
",
sex="
+
sex
+
",
position='"
+
position
+
'\''
+
"}";
}
}小民部门: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;
}
}小辉部门: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;
}
}可见小民和小辉的内部实现是两种方式,小民的人员信息容器的内部实质是使用的一个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;
}
@Override
public
boolean
hasNext()
{
return
!(position
>
list.size()
-
1
||
list.get(position)
==
null);
}
@Override
public
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;
}
@Override
public
boolean
hasNext()
{
return
!(position
>
array.length
-
1
||
array[position]
==
null);
}
@Override
public
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;
}
@Override
public
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;
}
@Override
publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024出口货物代理合同协议书
- 2024广西某小区环境景观工程合同
- 2024装修合同范本(家装、公装、标准版)
- 软件技术开发协议
- 消防安全操作员培训合同范本
- 涉外劳务合同的国际法律适用
- 2024监控施工合同模板
- 2024产权交易委托合同适用于转让方采取拍卖、招投标方式
- 深圳市注册会计师执业责任保险协议
- 2024对水果冷饮配送商监管协议
- DB34∕T 4010-2021 水利工程外观质量评定规程
- 完整2024年国有企业管理人员处分条例专题课件
- 安全生产治本攻坚三年行动实施方案(2024-2026年) - 副本
- GB/T 32066-2024煤基费托合成液体石蜡
- GB/T 97.2-2002平垫圈倒角型A级
- 六年级上册美术课件-第1课 建筑艺术的美 ▏人美版 (共20张PPT)
- 公路顶管穿越施工方案(中文)
- 华为任职资格等级制度
- 筋瘤中医护理.doc
- 最新阳性与阴性症状量表说明(精品课件)
- 健康促进医院环境建设工作总结(共3篇)
评论
0/150
提交评论