欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用设计模式中迭代器模式构建项目的代码结构示例

程序员文章站 2024-03-11 19:56:37
迭代器(iterator)模式,又叫做游标(cursor)模式。gof给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细...

迭代器(iterator)模式,又叫做游标(cursor)模式。gof给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
 
迭代器模式由以下角色组成:
迭代器角色(iterator):迭代器角色负责定义访问和遍历元素的接口。
具体迭代器角色(concrete iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
容器角色(container):容器角色负责提供创建具体迭代器角色的接口。
具体容器角色(concrete container):具体容器角色实现创建具体迭代器角色的接口。这个具体迭代器角色与该容器的结构相关。

java实现示例
类图:

Java使用设计模式中迭代器模式构建项目的代码结构示例

代码:

/** 
 * 自定义集合接口, 类似java.util.collection 
 * 用于数据存储 
 * @author stone 
 * 
 */ 
public interface icollection<t> { 
   
  iiterator<t> iterator(); //返回迭代器 
  void add(t t); 
  t get(int index); 
} 
/** 
 * 自定义迭代器接口 类似于java.util.iterator 
 * 用于遍历集合类icollection的数据 
 * @author stone 
 * 
 */ 
public interface iiterator<t> { 
  boolean hasnext(); 
  boolean hasprevious(); 
  t next(); 
  t previous(); 
} 
/** 
 * 集合类, 依赖于myiterator 
 * @author stone 
 */ 
public class mycollection<t> implements icollection<t> { 
 
  private t[] arys; 
  private int index = -1; 
  private int capacity = 5; 
   
  public mycollection() { 
    this.arys = (t[]) new object[capacity]; 
  } 
   
  @override 
  public iiterator<t> iterator() { 
    return new myiterator<t>(this); 
  } 
   
  @override 
  public void add(t t) { 
    index++; 
    if (index == capacity) { 
      capacity *= 2; 
      this.arys = arrays.copyof(arys, capacity); 
       
    } 
    this.arys[index] = t; 
  } 
   
  @override 
  public t get(int index) { 
    return this.arys[index]; 
  } 
   
} 


/* 
 * 若有新的存储结构,可new 一个icollection, 对应的 new 一个iiterator来实现它的遍历 
 */ 
@suppresswarnings({"rawtypes", "unchecked"}) 
public class test { 
  public static void main(string[] args) { 
    icollection<integer> collection = new mycollection<integer>(); 
    add(collection, 3, 5, 8, 12, 3, 3, 5); 
    for (iiterator<integer> iterator = collection.iterator(); iterator.hasnext();) { 
      system.out.println(iterator.next()); 
    } 
     
    system.out.println("-------------"); 
     
    icollection collection2 = new mycollection(); 
    add(collection2, "a", "b", "c", 3, 8, 12, 3, 5); 
    for (iiterator iterator = collection2.iterator(); iterator.hasnext();) { 
      system.out.println(iterator.next()); 
    } 
     
  } 
   
  static <t> void add(icollection<t> c, t ...a) { 
    for (t i : a) { 
      c.add(i); 
    } 
  } 
} 

打印:

3 
5 
8 
12 
3 
3 
5 
------------- 
a 
b 
c 
3 
8 
12 
3 
5