码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-12 09:17:01      阅读:165      评论:0      收藏:0      [点我收藏+]

标签: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
 * 
 * 
 */







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

标签:gof23   迭代器模式   

原文地址:http://blog.csdn.net/lk142500/article/details/45000057

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!