23种设计模式--迭代器模式

迭代器模式也是属于23种常用的设计模式里面的。这个的使用频率非常高。

 

什么叫迭代器模式?

提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

 

怎么理解这段话?

提供一个方法访问容器?首先要搞明白什么是容器。我的理解是在java中可以管理一组相同对象,且可以对对象进行增删改查的都可以称作容器。所以在java 中我认为集合就是一个容器。而且集合都可以被迭代。且集合可以存放对象,那么如果有个东西可以遍历对象。那么自然你就能得到每个对象的所有属性和方法。这个东西非迭代器莫属。事实上迭代器最常用的就是迭代集合。而且java 自身有迭代器这个类。下面我写一段遍历map集合的一段程序。

packagecom.fish.iterator;

 

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Map.Entry;

 

public class Test {

    public static void main(String[] args) {

        Person person1 = new Person("000001", "张三");

        Person person2 = new Person("000002", "李四");

        Person person3 = new Person("000003", "王五");

 

        Map<String, Person> map = new HashMap<String, Person>();

        map.put(person1.getId(), person1);

        map.put(person2.getId(), person2);

        map.put(person3.getId(), person3);

 

//上面我把数据全部放进了map里面,接着这么遍历map里面的数据,接着迭代器就发挥作用了。

首先map放值是以键值对存放的,所以要遍历map就必须先获得一个实体entrySet而这个对象本身有迭代的方法。然后我们通过迭代器来实现一个迭代。

        Iterator<Entry<String,Person>> iterator = map.entrySet().iterator();

        while (iterator.hasNext()) {

     Entry< String, Person>entry=iterator.next();

   System.out.println( entry.getKey()+entry.getValue().getName());

        }

 

    }

}

结果是

000002李四

000003王五

000001张三

 

从结果上来我们获得了map里面的所有数据,而且map里面的数据是无序的。

 

 

为什么这段代码就能进行迭代?

我们看看java本身是这么写这个iterator的。我们深入到这个itertor类里面可以看到有一个接口。这个接口里面只有3个方法。当然我们看不到java本身实现这个接口的类。

public interface Iterator<E> {

 

    boolean hasNext();

 

 

    E next();

 

 

    void remove();

}

其中hasnext是一个boolean类型,所以可以推断,这是用来控制循环的。

看到next我首先想到的是链表。就是每次往下走一个。也就是如果map在hasnext条件也为真的情况下调用next每次往下走,同时next里面有个计数器会自增。而这个计数器一定是作为hasnext的一个比较条件。当这个计数器和集合长度一样就停止。也就hasnxet为flase。

我们可以验证一下我的猜测,我把代码这样写

    while (iterator.hasNext()) {

//     Entry< String, Person>entry=iterator.next();

//   System.out.println(  entry.getKey()+entry.getValue().getName());

            System.out.println("111");

        }

输出的结果是死循环,因为没有往下走条件一直未真。所以next里面有一个计数器。所以迭代器模式是通过遍历算法来实现的。所以我只能借住别人的代码来实现一个迭代器。我写这个目的是加深理解集合和这种思想的。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值