迭代器模式(十六)

Andy 2023年06月08日 559次浏览

是 Java 和 .Net 编程环境中非常常用的设计模式
用于顺序访问集合对象的元素,不需要知道集合对象的底层表示

看到这个我想到了java的foreach,就是按顺序迭代集合和数组里的对象,不需要知道长度,从头到尾迭代

菜鸟案例:
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。
IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names。
image.png

老办法,拆图
image.png
一个迭代类的接口和一个它的实现类,方法hasNext 肯定就是判定下一个还存在不,看它的名称和返回类型推出来,而next肯定指向的就是下一个对象了,这样上图的思路就清晰了。
image.png
Container 接口里有获取迭代类的接口,老套路,返回类型虽然是接口类型,但是肯定返回的是它的实体类。,NameRepository 里面就是自己需要迭代的对象额,看到name数组了,获取迭代器类肯定即使为了迭代和判断name数组是否有值了,
现在主要是看它这俩怎么整合的。那就看代码吧

代码
(1)创建接口:
Iterator.java

public interface Iterator {
   public boolean hasNext();
   public Object next();
}

Container.java


    public interface Container {
       public Iterator getIterator();
    }

(2)创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator(也可以不用内部类,外部类也行,这样只是为了不让外部的类调用)
NameRepository.java

public class NameRepository implements Container {
   public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
 
   @Override
   public Iterator getIterator() {
   //返回一个内部类对象,通过这样的方式让外部来获取此类的内部类对象
      return new NameIterator();
   }
 //内部类实现了Iterator 的接口
   private class NameIterator implements Iterator {
 	//默认初始值为0,为了不出现别的问题,建议给初始值
      int index;
 	
      @Override
      public boolean hasNext() {   //判定是否还有下一个
         if(index < names.length){
            return true;
         }
         return false;
      }
 
      @Override
      public Object next() {   
         if(this.hasNext()){  //还存在就返回下一个
            return names[index++];
         }
         return null;
      }     
   }
}

(3)使用 NameRepository 来获取迭代器,并打印名字。
IteratorPatternDemo.java

public class IteratorPatternDemo {
   
   public static void main(String[] args) {
      NameRepository namesRepository = new NameRepository();
 	//这个就是正常的for循环,第一个参数获取对象,第二个是判定结束的条件,第三个可加可不加,
      for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
         String name = (String)iter.next();
         System.out.println("Name : " + name);
      }  
   }
}

执行程序,输出结果:

Name : Robert
Name : John
Name : Julie
Name : Lora
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99550739