3?完整解决方案
?????? 为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式,Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类的设计,重构之后的销售管理系统数据遍历结构如图4所示:
图4?销售管理系统数据遍历结构图
(注:为了简化类图和代码,本结构图中只提供一个具体聚合类和具体迭代器类)
?????? 在图4中,AbstractObjectList充当抽象聚合类,ProductList充当具体聚合类,AbstractIterator充当抽象迭代器,ProductIterator充当具体迭代器。完整代码如下所示:
- ??
- import?java.util.*;??
- ??
- ??
- abstract?class?AbstractObjectList?{??
- ????protected?List<Object>?objects?=?new?ArrayList<Object>();??
- public?AbstractObjectList(List?objects)?{??
- ????????this.objects?=?objects;??
- ????}??
- ??????
- public?void?addObject(Object?obj)?{??
- this.objects.add(obj);??
- void?removeObject(Object?obj)?{??
- this.objects.remove(obj);??
- public?List?getObjects()?{??
- return?this.objects;??
- ??????
- ????abstract?AbstractIterator?createIterator();??
- }??
- //商品数据类:具体聚合类??
- class?ProductList?extends?AbstractObjectList?{??
- public?ProductList(List?products)?{??
- super(products);??
- //实现创建迭代器对象的具体工厂方法??
- public?AbstractIterator?createIterator()?{??
- ????????new?ProductIterator(this);??
- ????}??
- }???
- //抽象迭代器??
- interface?AbstractIterator?{??
- void?next();???
- boolean?isLast();???
- void?previous();???
- boolean?isFirst();???
- public?Object?getNextItem();???
- public?Object?getPreviousItem();???
- //商品迭代器:具体迭代器??
- class?ProductIterator?implements?AbstractIterator?{??
- private?ProductList?productList;??
- private?List?products;??
- private?int?cursor1;???
- int?cursor2;???
- ??????
- public?ProductIterator(ProductList?list)?{??
- this.productList?=?list;??
- this.products?=?list.getObjects();???
- ????????cursor1?=?0;???
- ????????cursor2?=?products.size()?-1;???
- void?next()?{??
- if(cursor1?<?products.size())?{??
- ????????????cursor1++;??
- ????????}??
- boolean?isLast()?{??
- return?(cursor1?==?products.size());??
- void?previous()?{??
- if?(cursor2?>?-1)?{??
- ????????????cursor2--;??
- boolean?isFirst()?{??
- return?(cursor2?==?-1);??
- public?Object?getNextItem()?{??
- return?products.get(cursor1);??
- ????}???
- ??????????
- public?Object?getPreviousItem()?{??
- return?products.get(cursor2);??
- ????}?????
- }??
?????? 编写如下客户端测试代码: