遍历聚合对象中的元素——迭代器模式(三)

来源:互联网 发布:淘宝联盟频道推广 编辑:程序博客网 时间:2024/05/01 03:52

遍历聚合对象中的元素——迭代器模式(三)


3 完整解决方案

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

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

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

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

[java] view plaincopy
  1. //在本实例中,为了详细说明自定义迭代器的实现过程,我们没有使用JDK中内置的迭代器,事实上,JDK内置迭代器已经实现了对一个List对象的正向遍历  
  2. import java.util.*;  
  3.   
  4. //抽象聚合类  
  5. abstract class AbstractObjectList {  
  6.     protected List<Object> objects = new ArrayList<Object>();  
  7.   
  8.     public AbstractObjectList(List objects) {  
  9.         this.objects = objects;  
  10.     }  
  11.       
  12.     public void addObject(Object obj) {  
  13.         this.objects.add(obj);  
  14.     }  
  15.       
  16.     public void removeObject(Object obj) {  
  17.         this.objects.remove(obj);  
  18.     }  
  19.       
  20.     public List getObjects() {  
  21.         return this.objects;  
  22.     }  
  23.       
  24.     //声明创建迭代器对象的抽象工厂方法  
  25.     public abstract AbstractIterator createIterator();  
  26. }  
  27.   
  28. //商品数据类:具体聚合类  
  29. class ProductList extends AbstractObjectList {  
  30.     public ProductList(List products) {  
  31.         super(products);  
  32.     }  
  33.       
  34.     //实现创建迭代器对象的具体工厂方法  
  35.     public AbstractIterator createIterator() {  
  36.         return new ProductIterator(this);  
  37.     }  
  38. }   
  39.   
  40. //抽象迭代器  
  41. interface AbstractIterator {  
  42.     public void next(); //移至下一个元素  
  43.     public boolean isLast(); //判断是否为最后一个元素  
  44.     public void previous(); //移至上一个元素  
  45.     public boolean isFirst(); //判断是否为第一个元素  
  46.     public Object getNextItem(); //获取下一个元素  
  47.     public Object getPreviousItem(); //获取上一个元素  
  48. }  
  49.   
  50. //商品迭代器:具体迭代器  
  51. class ProductIterator implements AbstractIterator {  
  52.     private ProductList productList;  
  53.     private List products;  
  54.     private int cursor1; //定义一个游标,用于记录正向遍历的位置  
  55.     private int cursor2; //定义一个游标,用于记录逆向遍历的位置  
  56.       
  57.     public ProductIterator(ProductList list) {  
  58.         this.productList = list;  
  59.         this.products = list.getObjects(); //获取集合对象  
  60.         cursor1 = 0//设置正向遍历游标的初始值  
  61.         cursor2 = products.size() -1//设置逆向遍历游标的初始值  
  62.     }  
  63.       
  64.     public void next() {  
  65.         if(cursor1 < products.size()) {  
  66.             cursor1++;  
  67.         }  
  68.     }  
  69.       
  70.     public boolean isLast() {  
  71.         return (cursor1 == products.size());  
  72.     }  
  73.       
  74.     public void previous() {  
  75.         if (cursor2 > -1) {  
  76.             cursor2--;  
  77.         }  
  78.     }  
  79.       
  80.     public boolean isFirst() {  
  81.         return (cursor2 == -1);  
  82.     }  
  83.       
  84.     public Object getNextItem() {  
  85.         return products.get(cursor1);  
  86.     }   
  87.           
  88.     public Object getPreviousItem() {  
  89.         return products.get(cursor2);  
  90.     }     
  91. }  

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

[java] view plaincopy
  1. class Client {  
  2.     public static void main(String args[]) {  
  3.         List products = new ArrayList();  
  4.         products.add("倚天剑");  
  5.         products.add("屠龙刀");  
  6.         products.add("断肠草");  
  7.         products.add("葵花宝典");  
  8.         products.add("四十二章经");  
  9.               
  10.         AbstractObjectList list;  
  11.         AbstractIterator iterator;  
  12.           
  13.         list = new ProductList(products); //创建聚合对象  
  14.         iterator = list.createIterator();   //创建迭代器对象  
  15.           
  16.         System.out.println("正向遍历:");      
  17.         while(!iterator.isLast()) {  
  18.             System.out.print(iterator.getNextItem() + ",");  
  19.             iterator.next();  
  20.         }  
  21.         System.out.println();  
  22.         System.out.println("-----------------------------");  
  23.         System.out.println("逆向遍历:");  
  24.         while(!iterator.isFirst()) {  
  25.             System.out.print(iterator.getPreviousItem() + ",");  
  26.             iterator.previous();  
  27.         }  
  28.     }  
  29. }  

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

正向遍历:

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

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

逆向遍历:

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

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


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机己锁定怎么办魅族 魅蓝u10触屏没反应怎么办 魅蓝e2手机锁定怎么办 苹果手机声音键坏了怎么办 一加6的屏幕问题怎么办 魅蓝note6卡顿怎么办 苹果4s内屏坏了怎么办 魅族mx6一直重启怎么办 魅族充电慢了怎么办啊 笔记本玩游戏掉帧怎么办 psv玩游戏掉帧怎么办 ipad玩游戏掉帧怎么办 手机玩游戏严重掉帧怎么办 苹果7p掉电快怎么办 努比亚z11手机总是开关机怎么办 努比亚手机不能保存图片怎么办 小米8拍照和努比亚怎么办 oppor7手机开不了机怎么办 vivox5m手机开不开机怎么办 步步高x7图案解锁忘记怎么办 手机机锁定怎么办魅族 衣服买完降价了怎么办 在淘宝上不发货怎么办 一加3t吃鸡卡怎么办 小米max打游戏反应慢怎么办 小米max2手机玩游戏卡怎么办 魅蓝metal开不了机怎么办 魅蓝e手机信号差怎么办 魅蓝metal手机已锁定怎么办 魅族not3卡开了怎么办 魅族metal手机好卡怎么办 魅蓝手机锁机了怎么办 魅族note2屏坏了怎么办 魅族mx3开不开机怎么办 魅蓝max3充电慢怎么办? 魅族手机home键失灵怎么办 魅族开关键坏了怎么办 魅族开关键不灵怎么办 魅蓝开机键坏了怎么办 魅族开关机坏了怎么办 小米开机键坏了怎么办