设计模式4——Itrator设计模式

Iterator迭代器模式,提供一种统一的方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节,迭代器模式是为容器而设计。

程序对容器对象的访问必然涉及到遍历算法,不同的容器遍历算法是不同的,List,Stack和Set等等常用容器遍历元素的算法各不相同。解决容器遍历算法差异有两种方案:第一,可以将遍历方法塞到容器对象中去,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;第二,根本不提供容器遍历算法,让容器使用者自己去实现。该方法虽然是省事,却又将容器的内部细节暴露无遗。 迭代器模式的出现,很好的解决了上面两种情况的弊端,不但将遍历容器的算法从不同集合容器类中抽象出来,同时又对外隐藏了容器的具体实现细节。

迭代器模式由以下角色组成: 
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。 
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。 
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。 
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。

迭代器模式UML图如下:


Java集合框架中迭代设计模式的应用:

//迭代器 ,该接口提供了迭代遍历的通用方法
public interface Iterator { 
      boolean hasNext(); 
      Object next(); 
      void remove(); 
} 
//容器迭代化接口,凡是实现此接口的集合容器距可以生成相应的迭代器 
public interface Iterable<T>{
      //产生迭代器,将容器对象转换为迭代器对象
      Iterator<T> interator();
}
//java集合框架的根接口,该接口继承了容器迭代化接口,因此java中的集合都可以被迭代
public interface Collection<E> extends Iterable<E>

自定义迭代器,以ArrayList为自定义迭代容器的底层数据结构,实现自定义迭代器的代码如下:

public class MyIterator implements Iterable { 
      //存放数据的集合
      private ArrayList list;
     //负责创建具体迭代器角色的工厂方法 
     public Iterator iterator() { 
          return new Itr(list); 
     } 
    //作为内部类的具体迭代器角色 
    private class Itr implements Iterator { 
           ArrayList myList;
          int position = 0; 
           public Itr(ArrayList list) { 
                  this.myList = list; 
           } 
           public Object next() { 
                  Object obj = myList.get(position);
                  position++; 
                  return obj; 
          } 
          public boolean hasNext() { 
                 if (position >= myList.size()) { 
                       return false; 
                 } else { 
                     return true; 
                 } 
           }
        //不支持remove操作
        public void remove(){
              throw new UnsupportedOperationException( 
            "Alternating MyIterator does not support remove()"); 
}
 }
 } 

使用时,MyIterator对象直接调用iterator()方法就可以将自定义容器对象转换为迭代器对象。

Iterator模式的优点:

(1).实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
(2).隐藏容器的实现细节。
(3).为容器或其子容器提供了一个统一接口,一方面方便调用;另一方面使得调用者不必关注迭代器的实现细节。
(4).可以为容器或其子容器实现不同的迭代方法或多个迭代方法。

JDK中设计模式的应用:

java.util.Iterator

java.util.Enumeration


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值