博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
遍历聚合对象中的元素——迭代器模式(三)
阅读量:5254 次
发布时间:2019-06-14

本文共 3185 字,大约阅读时间需要 10 分钟。

3 完整解决方案

       为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式,Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类的设计,重构之后的销售管理系统数据遍历结构如图4所示:

图4销售管理系统数据遍历结构图

(注:为了简化类图和代码,本结构图中只提供一个具体聚合类和具体迭代器类)

       在图4中,AbstractObjectList充当抽象聚合类,ProductList充当具体聚合类,AbstractIterator充当抽象迭代器,ProductIterator充当具体迭代器。完整代码如下所示:

//在本实例中,为了详细说明自定义迭代器的实现过程,我们没有使用JDK中内置的迭代器,事实上,JDK内置迭代器已经实现了对一个List对象的正向遍历import java.util.*;//抽象聚合类abstract class AbstractObjectList {	protected List objects = new ArrayList();	public AbstractObjectList(List objects) {		this.objects = objects;	}		public void addObject(Object obj) {		this.objects.add(obj);	}		public void removeObject(Object obj) {		this.objects.remove(obj);	}		public List getObjects() {		return this.objects;	}	    //声明创建迭代器对象的抽象工厂方法	public abstract AbstractIterator createIterator();}//商品数据类:具体聚合类class ProductList extends AbstractObjectList {	public ProductList(List products) {		super(products);	}	    //实现创建迭代器对象的具体工厂方法	public AbstractIterator createIterator() {		return new ProductIterator(this);	}} //抽象迭代器interface AbstractIterator {	public void next(); //移至下一个元素	public boolean isLast(); //判断是否为最后一个元素	public void previous(); //移至上一个元素	public boolean isFirst(); //判断是否为第一个元素	public Object getNextItem(); //获取下一个元素	public Object getPreviousItem(); //获取上一个元素}//商品迭代器:具体迭代器class ProductIterator implements AbstractIterator {	private ProductList productList;	private List products;	private int cursor1; //定义一个游标,用于记录正向遍历的位置	private int cursor2; //定义一个游标,用于记录逆向遍历的位置		public ProductIterator(ProductList list) {		this.productList = list;		this.products = list.getObjects(); //获取集合对象		cursor1 = 0; //设置正向遍历游标的初始值		cursor2 = products.size() -1; //设置逆向遍历游标的初始值	}		public void next() {		if(cursor1 < products.size()) {			cursor1++;		}	}		public boolean isLast() {		return (cursor1 == products.size());	}		public void previous() {		if (cursor2 > -1) {			cursor2--;		}	}		public boolean isFirst() {		return (cursor2 == -1);	}		public Object getNextItem() {		return products.get(cursor1);	} 			public Object getPreviousItem() {		return products.get(cursor2);	} 	}

       编写如下客户端测试代码:

class Client {	public static void main(String args[]) {		List products = new ArrayList();		products.add("倚天剑");		products.add("屠龙刀");		products.add("断肠草");		products.add("葵花宝典");		products.add("四十二章经");					AbstractObjectList list;		AbstractIterator iterator;				list = new ProductList(products); //创建聚合对象		iterator = list.createIterator();	//创建迭代器对象				System.out.println("正向遍历:");			while(!iterator.isLast()) {			System.out.print(iterator.getNextItem() + ",");			iterator.next();		}		System.out.println();		System.out.println("-----------------------------");		System.out.println("逆向遍历:");		while(!iterator.isFirst()) {			System.out.print(iterator.getPreviousItem() + ",");			iterator.previous();		}	}}

       编译并运行程序,输出结果如下:

正向遍历:

倚天剑,屠龙刀,断肠草,葵花宝典,四十二章经,

-----------------------------

逆向遍历:

四十二章经,葵花宝典,断肠草,屠龙刀,倚天剑

       如果需要增加一个新的具体聚合类,如客户数据集合类,并且需要为客户数据集合类提供不同于商品数据集合类的正向遍历和逆向遍历操作,只需增加一个新的聚合子类和一个新的具体迭代器类即可,原有类库代码无须修改,符合“开闭原则”;如果需要为ProductList类更换一个迭代器,只需要增加一个新的具体迭代器类作为抽象迭代器类的子类,重新实现遍历方法,原有迭代器代码无须修改,也符合“开闭原则”;但是如果要在迭代器中增加新的方法,则需要修改抽象迭代器源代码,这将违背“开闭原则”。

 

【作者:刘伟  

转载于:https://www.cnblogs.com/pangblog/p/3262833.html

你可能感兴趣的文章
卷积中的参数
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
STEP2——《数据分析:企业的贤内助》重点摘要笔记(六)——数据描述
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
Android弹出框的学习
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>