• 设计模式详解——迭代器模式


    前言

    今天我们要学习的这个设计模式,我们其实在日常开发中也经常用到,但也仅仅只是用过,所以很多时候我都不觉得它是一种设计模式,它就是迭代器模式,由于这个设计模式比较简单,所以关于它我们能讲的内容也不多,因此呢,今天的内容也就比较少。

    迭代器模式

    迭代器模式(Iterator Pattern)是 Java .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

    迭代器模式提供了一种方法顺序,访问一个聚合对象中的各个元素,而又不暴露其内部具体实现细节

    要点

    • 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的实现细节
    • 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所

    应用

    关于迭代器模式,用的最多的当然就是java容器部分的相关内容,比如Collection接口。这里我们通过一个简易的手写容器,来演示它具体的应用场景。

    适配器接口

    首先是迭代器的接口,它有两个方法,一个用于判断容器是否包含元素;另一个用于拿出容器中的当前角标最小的元素(默认为为0

    public interface Iterator {
       boolean hasNext();
       Object next();
    }
    
    容器接口

    然后是容器接口,容器接口只有一个方法,就是获取迭代器。

    public interface Container {
       Iterator getIterator();
    }
    
    容器实现

    容器的内部实现包括了迭代器的实现

    public class SyskeContainer implements Container {
       public Object[] values = {"云中志" , "java" ,"志哥" , "syske"};
     
       @Override
       public Iterator getIterator() {
          return new SyskeIterator();
       }
     
       private class SyskeIterator implements Iterator {
     
          int index;
     
          @Override
          public boolean hasNext() {
             if(index < values.length){
                return true;
             }
             return false;
          }
     
          @Override
          public Object next() {
             if(this.hasNext()){
                return values[index++];
             }
             return null;
          }     
       }
    }
    
    测试代码

    下面的测试代码也很简单,就是获取SyskeContainer的迭代器,然后通过它的迭代器,实现对SyskeContainer容器的遍历操作:

    public class SyskeContainerTest extends TestCase {
    
        public void testIterator() {
            SyskeContainer syskeContainer = new SyskeContainer();
            Iterator iterator = syskeContainer.getIterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    
    }
    

    运行结果如下:

    总结

    从上面的内容以及我们的代码中其实可以看出来,相比于我们前面讲到的设计模式,迭代器的内容就显得比较少,而且比较简单,更重要的是,它的应用场景也很窄,基本上都是集中在批量操作的业务中,所起的作用就是代替具体的容器,实现遍历操作,然后实现具体容器与业务之间的耦合关系。

  • 相关阅读:
    day33-1 线程队列
    day32-4 GIL全局解释锁
    day32-3 阻塞非阻塞同步异步&异步回调
    day32-2 线程池与进程池
    day32-1 事件Event
    Chrome设置--disable-web-security解决跨域问题
    去除系统部分属性触摸是出现的色值
    初始化一个React项目
    ## normalize.css 中文版
    vue组件的3种书写形式
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15449799.html
Copyright © 2020-2023  润新知