最新迭代器模式实验含答案Word文档格式.docx
- 文档编号:22657489
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:18
- 大小:296.26KB
最新迭代器模式实验含答案Word文档格式.docx
《最新迭代器模式实验含答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《最新迭代器模式实验含答案Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。
为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。
这被称为多态迭代。
迭代器模式所涉及的角色有:
参与者:
•迭代器角色(Iterator):
定义访问和遍历元素的接口。
•具体迭代器角色(ConcreteIterator):
关联到被迭代的具体聚集对象角色,继承迭代器角色实现具体的迭代,并负责管理记录遍历中的当前位置。
•聚集对象抽象角色(Aggregate):
负责提供创建具体迭代器角色的接口。
•具体聚集对象角色(ConcreteAggreate):
持有一个对象的集合,实现创建具体迭代器角色的接口,返回集合遍历所依赖的一个迭代器。
●一个迭代器模式例子:
●20世纪80年代的黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,如果你想换台的话,需要亲自用手去旋转换台的按钮,每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。
还要移动电视机上面那两根可以前后左右移动变长变短的天线。
随着科技的飞速发展,越来越高级的电视机相继出现,那种古老的电视机几乎看不到了。
与那时的电视机相比,现今的电视机给我们带来的最大便利之一就是增加了电视机遥控器,我们在进行开机、关机、换台、改变音量等操作时都无须直接操作电视机,可以通过遥控器来间接实现。
我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。
遥控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。
电视机遥控器和电视机示意图如图1所示:
●
●在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(AggregateClasses),对应的对象称为聚合对象。
为了更加方便地操作这些聚合对象,同时可以很灵活地为聚合对象增加不同的遍历方法,我们也需要类似电视机遥控器一样的角色,可以访问一个聚合对象中的元素但又不需要暴露它的内部结构。
本章我们将要学习的迭代器模式将为聚合对象提供一个遥控器,通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式。
●迭代器模式的作用:
●迭代器模式能够遍历一组聚合对象,不需要了解其内部结构还能提供不同的遍历方法。
●就是分离了集合对象的遍历行为,将遍历算法交给这个迭代器角色来完成,可以很好的避免容器内部细节的暴露,而且也使得设计符合“单一职责原则”,另外迭代器模式抽象了具体迭代器角色,可以通过对一个抽象迭代器多个集成可来完成同一聚集对象的多种遍历。
五、迭代器模式示例性代码
首先有一个抽象的聚集,所谓的聚集就是就是数据的集合,可以循环去访问它。
它只有一个方法GetIterator()让子类去实现,用来获得一个迭代器对象。
1
///
<
summary>
2
3
抽象聚集
4
5
/summary>
6
7
public
interface
IList
8
9
{
10
IIterator
GetIterator();
11
}
抽象的迭代器,它是用来访问聚集的类,封装了一些方法,用来把聚集中的数据按顺序读取出来。
通常会有MoveNext()、CurrentItem()、Fisrt()、Next()等几个方法让子类去实现。
抽象迭代器
IIterator
bool
MoveNext();
Object
CurrentItem();
12
13
void
First();
14
15
Next();
16
具体的聚集,它实现了抽象聚集中的唯一的方法,同时在里面保存了一组数据,这里我们加上Length属性和GetElement()方法是为了便于访问聚集中的数据。
具体聚集
class
ConcreteList
:
int[]
list;
ConcreteList()
list
=
new
{
1,2,3,4,5};
17
GetIterator()
18
19
20
return
ConcreteIterator(this);
21
22
23
int
Length
24
25
26
get
list.Length;
27
28
29
GetElement(int
index)
30
31
32
list[index];
33
34
具体迭代器,实现了抽象迭代器中的四个方法,在它的构造函数中需要接受一个具体聚集类型的参数,在这里面我们可以根据实际的情况去编写不同的迭代方式。
/**////
具体迭代器
ConcreteIterator
private
index;
ConcreteIterator(ConcreteList
list)
this.list
index
0;
MoveNext()
if
(index
list.Length)
true;
else
false;
CurrentItem()
35
36
37
list.GetElement(index)
;
38
39
40
First()
41
42
43
44
45
46
Next()
47
48
49
50
51
52
index++;
53
54
55
简单的客户端程序调用:
客户端程序
Program
static
Main(string[]
args)
iterator;
IList
ConcreteList();
iterator
list.GetIterator();
while
(iterator.MoveNext())
i
(int)iterator.CurrentItem();
Console.WriteLine(i.ToString());
iterator.Next();
Console.Read();
Iterator实现要点:
1.迭代抽象:
访问一个聚合对象的内容而无需暴露它的内部表示。
2.迭代多态:
为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。
3.迭代器的健壮性考虑:
遍历的同时更改迭代器所在的集合结构,会导致问题。
题目:
假设某软件公司Z为某超市开发了一套销售管理系统,在对该系统进行分析和设计时,Z公司开发人员发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,Z公司开发人员设计了一个抽象的数据聚合类AbstractObjectList,而将存储商品和客户登记的类作为其子类。
AbstractObjectList类结构如下图所示。
在上图中,IList类型的对象objects用于存储数据,AbstractObjectList类的方法说明如下表所示:
AbstractObjectList类的子类ProductList和CustomerList分别用于存储商品数据和客户数据。
请用迭代器模式编程实现。
代码:
importjava.util.*;
//抽象聚合类
abstractclassAbstractObjectList{
protectedList<
Object>
objects=newArrayList<
();
publicAbstractObjectList(Listobjects){
this.objects=objects;
}
publicvoidaddObject(Objectobj){
this.objects.add(obj);
publicvoidremoveObject(Objectobj){
this.objects.remove(obj);
publicListgetObjects(){
returnthis.objects;
//声明创建迭代器对象的抽象工厂方法
publicabstractAbstractIteratorcreateIterator();
}
//商品数据类:
具体聚合类
classProductListextendsAbstractObjectList{
publicProductList(Listproducts){
super(products);
//实现创建迭代器对象的具体工厂方法
publicAbstractIteratorcreateIterator(){
returnnewProductIterator(this);
//客户数据类:
classCustomerListextendsAbstractObjectList{
publicCustomerList(Listcustomers){
super(customers);
returnnewCustomerIterator(this);
//抽象迭代器
interfaceAbstractIterator{
publicvoidnext();
//移至下一个元素
publicbooleanisLast();
//判断是否为最后一个元素
publicvoidprevious();
//移至上一个元素
publicbooleanisFirst();
//判断是否为第一个元素
publicObjectgetNextItem();
//获取下一个元素
publicObjectgetPreviousItem();
//获取上一个元素
//商品迭代器:
具体迭代器
classProductIteratorimplementsAbstractIterator{
privateProductListproductList;
privateListproducts;
privateintcursor1;
//定义一个游标,用于记录正向遍历的位置
privateintcursor2;
//定义一个游标,用于记录逆向遍历的位置
publicProductIterator(ProductListlist){
this.productList=list;
this.products=list.getObjects();
//获取集合对象
cursor1=0;
//设置正向遍历游标的初始值
cursor2=products.size()-1;
//设置逆向遍历游标的初始值
publicvoidnext(){
if(cursor1<
products.size()){
cursor1++;
}
publicbooleanisLast(){
return(cursor1==products.size());
publicvoidprevious(){
if(cursor2>
-1){
cursor2--;
publicbooleanisFirst(){
return(cursor2==-1);
publicObjectgetNextItem(){
returnproducts.get(cursor1);
publicObjectgetPreviousItem(){
returnproducts.get(cursor2);
//客户迭代器:
classCustomerIteratorimplementsAbstractIterator{
privateCustomerListcustomerList;
privateListcustomers;
publicCustomerIterator(CustomerListlist){
this.customerList=list;
this.customers=list.getObjects();
cursor2=customers.size()-1;
customers.size()){
return(cursor1==customers.size());
returncustomers.get(cursor1);
returncustomers.get(cursor2);
publicclassIterator{
publicstaticvoidmain(Stringargs[]){
List<
String>
products=newArrayList<
products.add("
农夫山泉"
);
百岁山"
康师傅"
旺仔"
统一"
AbstractObjectListlist;
AbstractIteratoriterator;
list=newProductList(products);
//创建聚合对象
iterator=list.createIterator();
//创建迭代器对象
System.out.println("
***************商品数据***************"
正向遍历:
"
while(!
iterator.isLast()){
System.out.print(iterator.getNextItem()+"
,"
iterator.next();
System.out.println();
逆向遍历:
iterator.isFirst()){
System.out.print(iterator.getPreviousItem()+"
iterator.previous();
customers=newArrayList<
customers.add("
张三"
李四"
王五"
赵六"
AbstractObjectListlist1;
AbstractIteratoriterator1;
喜欢□一般□不喜欢□list1=newProductList(customers);
目前,上海市创业培训中心已开办大学生创业培训班,共招收上海交通大学、上海商业职业技术学院等应届毕业生62人。
iterator1=list1.createIterator();
(二)大学生对DIY手工艺品消费态度分析System.out.println();
(3)优惠多System.out.println("
***************客户数据***************"
iterator1.isLast()){
图1-5购物是对消费环境的要求分布System.out.print(iterator1.getNextItem()+"
年轻有活力是我们最大的本钱。
我们这个自己动手做的小店,就应该与时尚打交道,要有独特的新颖性,这正是我们年轻女孩的优势。
iterator1.next();
3、消费“多样化”}
据了解,百分之八十的饰品店都推出“DIY饰品”来吸引顾客,一方面顺应了年轻一代喜欢与众不同、标新立异的心理;
另一方面,自
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 迭代器 模式 实验 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)