天 辰 招 商

  天 辰 招 商 【Q和V同:45545 】【顶尖待遇一步到位】-注-册-.-充-值-.-代-理-.-开-户,无需打开页面.欢迎随时咨询!迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
  简单描述:提供一个单独的接口遍历聚集类对象中的成员,以实现聚集对象的隐藏和内部数据供外部访问
  大话设计模式中的截图:
  天 辰 招 商 【Q和V同:45545 】【顶尖待遇一步到位】-注-册-.-充-值-.-代-理-.-开-户,无需打开页面.欢迎随时咨询!我觉得以上面的图示进行编码会暴露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 小偷,请买车票
  当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者需要对聚集对象有多种遍历方式时,就应该考虑用迭代器模式。
  天 辰 招 商 【Q和V同:45545 】【顶尖待遇一步到位】-注-册-.-充-值-.-代-理-.-开-户,无需打开页面.欢迎随时咨询!迭代器模式分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明的访问集合内部的数据

猜你喜欢

转载自www.cnblogs.com/wwyyff80/p/12784062.html
今日推荐