GOF23设计模式之迭代器模式理解与实现


 

迭代器模式
 
     场景:
 
         提供一种可以遍历聚合对象的方式。又称为游标cursor模式
 
         聚合对象:存储数据
 
         迭代器模式:遍历数据
 
 
 
聚集抽象类 Aggregate
 
Iterator
迭代抽象类,用于定义得到开始对象,得到下一个对象,判断是否到结尾,当前对象等抽象方法,统一接口
 
具体聚集类:继承Aggregate
 
具体迭代器类,继承Iterator,实现开始,下一个,是否结尾,当前对象等方法。
 
 
 
使用场景:
 
     前向迭代器
 
     后向迭代器
 
 
 
List/Set内置的迭代器

/**
 * 自定义抽象迭代器接口
 */
package com.bjsxt.cn.iterator;
public interface MyIterator {
 public void first();//将游标指向下一个元素
 public void last();//将有表指向最后一个元素
 public void next();
 
 public boolean hasNext();//判断是否有下一个元素
 public boolean isFirst();
 public boolean isLast();
 public Object CurrentObj();//获取当前对象
}
 
 
 
 
package com.bjsxt.cn.iterator;
import java.util.ArrayList;
import java.util.List;
/**
 * 自定义聚合类
 * @author wannachan@outlook.com
 *
 */
public class ConcreteMyAggregate {
 private List<Object> list = new ArrayList<Object>();
 
 public void addObject(Object obj) {
  list.add(obj);
 }
 
 public Object removeObj(Object obj) {
  return list.remove(obj);
 }
 
 //获得迭代器
 public MyIterator createIterator() {
  return new ConcreteIterator(); 
 }
 //使用内部类定义迭代器,可以直接使用外部类的属性
 private class ConcreteIterator implements MyIterator {
  private int cursor;//定义游标用于记录遍历时的位置
  @Override
  public void first() {
   cursor = 0;
  }
  @Override
  public void last() {
   cursor = list.size() - 1;
  }
  @Override
  public boolean hasNext() {
   if (cursor < list.size()) {
    return true;
   }
   return false;
  }
  @Override
  public boolean isFirst() {
   return (cursor == 0)?true:false;
  }
  @Override
  public boolean isLast() {
   return (cursor == list.size()-1)?true:false;
  }
  @Override
  public Object CurrentObj() {
   if (cursor < list.size() ) {
    return list.get(cursor);
    
   }
   return null;
  }
  @Override
  public void next() {
   if (cursor < list.size()) {
    cursor++;
   }
   
  }
  
 }
} 
 
 
 
 
/**
 * 测试类
 * 2015年4月11日21:15:43
 */
package com.bjsxt.cn.iterator;
public class Client {
 public static void main(String[] args) {
  ConcreteMyAggregate cma = new ConcreteMyAggregate();
  cma.addObject("AA");
  cma.addObject("BB");
  cma.addObject(new Student("周杰伦", 10000));
  cma.addObject(1);
  
  MyIterator iterator = cma.createIterator();
  
  while (iterator.hasNext()) {
   System.out.println(iterator.CurrentObj());
   iterator.next();
  }
 }
}
class Student {
 private String name;
 private int id;
 public Student(String name, int id) {
  super();
  this.name = name;
  this.id = id;
 }
 
 public Student() {
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 
 @Override
 public String toString() {
  return name + " "+ "id 为 " + id;
 }
 
}
/*
 * AA
BB
周杰伦 id 为 10000
1
 * 
 * 
 */
 
 
 
 
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值