首页 > 代码库 > 大话设计模式_迭代器模式(Java代码)
大话设计模式_迭代器模式(Java代码)
迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
简单描述:提供一个单独的接口遍历聚集类对象中的成员,以实现聚集对象的隐藏和内部数据供外部访问
大话设计模式中的截图:
我觉得以上面的图示进行编码会暴露ConcreteAggregate中的内部信息(ConcreteIerator可以访问聚集类中的成员,那表示其他类也可以和ConcreteIerator一样进行相同的访问),所以我以另外一种形式实现迭代器(即内部类的方式,和Java中的ArrayList类似)
代码例子:
AbstractIterator类:
1 package com.longsheng.iterator; 2 3 public abstract class AbstractIterator { 4 5 public abstract Object first(); 6 7 public abstract Object next(); 8 9 public abstract boolean isDone(); 10 11 public abstract Object currentItem(); 12 13 }
AbstractAggregate类:
1 package com.longsheng.iterator; 2 3 public abstract class AbstractAggregate { 4 5 public abstract AbstractIterator getIterator(); 6 7 }
ConcreteAggregate类:
1 package com.longsheng.iterator; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class ConcreteAggregate extends AbstractAggregate { 7 8 private List<Object> container = new ArrayList<Object>(); 9 10 @Override 11 public AbstractIterator getIterator() { 12 return new ConcreteIterator(); 13 } 14 15 public void add(Object mObject) { 16 container.add(mObject); 17 } 18 19 public void remove(Object mObject) { 20 container.remove(mObject); 21 } 22 23 private class ConcreteIterator extends AbstractIterator { 24 25 int currentPosition = 0; 26 27 @Override 28 public Object first() { 29 if (container.size() > 0) { 30 return container.get(0); 31 } 32 return null; 33 } 34 35 @Override 36 public Object next() { 37 int index = currentPosition++; 38 if (index < container.size()) { 39 return container.get(index); 40 } 41 return null; 42 } 43 44 @Override 45 public boolean isDone() { 46 if( currentPosition >= container.size() ) { 47 return true; 48 } 49 return false; 50 } 51 52 @Override 53 public Object currentItem() { 54 if( currentPosition < container.size() ){ 55 return container.get(currentPosition); 56 } 57 return null; 58 } 59 60 } 61 }
客户端类:
1 package com.longsheng.iterator; 2 3 public class Client { 4 5 public static void main(String args[]) { 6 ConcreteAggregate mAggregate = new ConcreteAggregate(); 7 mAggregate.add("大鸟"); 8 mAggregate.add("小菜"); 9 mAggregate.add("行李"); 10 mAggregate.add("老外"); 11 mAggregate.add("公交内部员工"); 12 mAggregate.add("小偷"); 13 14 AbstractIterator mIterator = mAggregate.getIterator(); 15 while( mIterator.isDone() == false ) { 16 System.out.println(mIterator.next() + ",请买车票"); 17 } 18 } 19 20 }
运行结果:
1 大鸟,请买车票 2 小菜,请买车票 3 行李,请买车票 4 老外,请买车票 5 公交内部员工,请买车票 6 小偷,请买车票
当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者需要对聚集对象有多种遍历方式时,就应该考虑用迭代器模式。
迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。