阿里华为等大厂如何实践迭代器模式的?(上)

简介: 定义:行为型,Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)基本不会有人业务开发使用的模式,没人会单独写一个迭代器,除非是产品性质的开发。迭代器是为容器服务的,例如Collection、Map等,迭代器模式就是为解决遍历这些容器中的元素而生。

1 概念

定义

行为型,Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)

基本不会有人业务开发使用的模式,没人会单独写一个迭代器,除非是产品性质的开发。

迭代器是为容器服务的,例如Collection、Map等,迭代器模式就是为解决遍历这些容器中的元素而生。

image.png

容器只要负责新增、移除元素即可,遍历由迭代器进行。

角色

Iterator抽象迭代器

抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:

  first()获得第一个元素

  next()访问下一个元素

  hasNext()是否已经访问到底部


ConcreteIterator具体迭代器

具体迭代器角色要实现迭代器接口,完成容器元素的遍历。


Aggregate抽象容器

容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法。


Concrete Aggregate具体容器

具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。


我们来看迭代器模式的通用源代码


抽象迭代器

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

具体迭代器

public class ConcreteIterator implements Iterator {
     private Vector vector = new Vector();
     //定义当前游标
     public int cursor = 0;
     @SuppressWarnings("unchecked")
     public ConcreteIterator(Vector _vector){
             this.vector = _vector;
     }
     //判断是否到达尾部
     public boolean hasNext() {
             if(this.cursor == this.vector.size()){
                    return false;
             }else{
                    return true;
             }
     }
     //返回下一个元素
     public Object next() {
             Object result = null;
             if(this.hasNext()){
                    result = this.vector.get(this.cursor++);
             }else{
                    result = null;
             }
             return result;
     }
     //删除当前元素
     public boolean remove() {
             this.vector.remove(this.cursor);
             return true;
     }
}

开发系统时,迭代器的删除方法应该完成两个逻辑:

  • 删除当前元素
  • 当前游标指向下一个元素
  • 抽象容器
public interface Aggregate {
     //是容器必然有元素的增加
     public void add(Object object);
     //减少元素
     public void remove(Object object);
     //由迭代器来遍历所有的元素
     public Iterator iterator();
}
  • 具体容器
 
         
  • 场景类
public class Client {
     public static void main(String[] args) {
             //声明出容器
             Aggregate agg = new ConcreteAggregate();
             //产生对象数据放进去
             agg.add("abc");
             agg.add("aaa");
             agg.add("1234");     
             //遍历一下
             Iterator iterator = agg.iterator();
             while(iterator.hasNext()){
                     System.out.println(iterator.next());
             }
     }
}

2 适用场景

  • 访问一个集合对象的内容而无需暴露它的内部表示
  • 为遍历不同的集合结构提供一个统一的接口

我们在例子中使用了迭代器模式后为什么使原本简单的应用变得复杂起来了呢?那是因为我们在简单的应用中使用了迭代器,在哪?

注意这段话

for(IProject project:projectList)

它为什么能够运行起来?还不是因为ArrayList已经实现了iterator()方法,我们才能如此简单地应用。


从JDK 1.2版本开始增加java.util.Iterator这个接口,并逐步把Iterator应用到各个聚集类(Collection)中,我们来看JDK 1.5的API帮助文件,你会看到有一个叫java.util.Iterable的接口

看看有多少个接口继承了它:

BeanContext,BeanContextServices,BlockingQueue,Collection,List,Queue,Set,SortedSet

再看看有它多少个实现类:AbstractCollection,AbstractList,AbstractQueue,AbstractSequentialList,AbstractSet,ArrayBlockingQueue,ArrayList,AttributeList,BeanContextServicesSupport,BeanContextSupport,ConcurrentLinkedQueue,CopyOnWriteArrayList,CopyOnWriteArraySet,DelayQueue,EnumSet,HashSet,JobStateReasons,LinkedBlockingQueue,LinkedHashSet,LinkedList,PriorityBlockingQueue,PriorityQueue,RoleList,RoleUnresolvedList,Stack,SynchronousQueue,TreeSet,Vector

基本上我们经常使用的类都在这个表中了,也正是因为Java把迭代器模式已经融入到基本API中了,我们才能如此轻松、便捷。


我们再来看看Iterable接口。java.util.Iterable接口只有一个方法:iterator(),也就说,通过iterator()这个方法去遍历聚集类中的所有方法或属性,基本上现在所有的高级语言都有Iterator这个接口或者实现,Java已经把迭代器给我们准备好了,我们再去写迭代器,就有点多余了。所以呀,这个迭代器模式也有点没落了,基本上很少有项目再独立写迭代器了,直接使用Collection下的实现类就可以完美地解决问题。


迭代器现在应用得越来越广泛了,甚至已经成为一个最基础的工具。一些大师级人物甚至建议把迭代器模式从23个模式中删除,为什么呢?就是因为现在它太普通了,已经融入到各个语言和工具中了,比如PHP中你能找到它的身影,Perl也有它的存在,甚至是前台的页面技术AJAX也可以有它的出现(如在Struts2中就可以直接使用iterator)。基本上,只要你不是在使用那些古董级(指版本号)的编程语言的话,都不用自己动手写迭代器。

3 优点

分离了集合对象的遍历行为

4 缺点

类的个数成对增加

目录
相关文章
|
3月前
|
存储 SQL NoSQL
现在的湖仓一体像是个伪命题
从一体机、超融合到云计算、HTAP,技术不断演进,旨在简化和提高效率。湖仓一体(Lakehouse)是当前热门趋势,旨在将数据湖和数据仓库融合,发挥两者优势。数据湖侧重存储原始数据,数据仓库则擅长结构化数据计算。然而,现有方案多为数据湖与数据仓库的松耦合,未能真正实现“既存又算”。开源集算器SPL通过开放计算引擎,直接处理数据湖中的原始数据,支持多数据源混合计算,提供高性能文件存储,实现了真正的湖仓一体。
|
搜索推荐 API 数据安全/隐私保护
对标大厂的技术派架构设计
通常对于技术人员而言,在开启一个新的项目之前,做了前期的调研、立项之后,第一件事情并不是开始搭建工程、撸代码,一个整体的架构方案设计、评审都属于不可忽视的环节。 接下来我将尽量追溯还原技术派的整体架构,是如何从 0 到 1 进行敲定的。
158 0
|
存储 分布式计算 Cloud Native
人柱力和佩恩六道,谁才是湖仓一体的终极形态?
人柱力和佩恩六道,谁才是湖仓一体的终极形态?
186 1
|
数据采集 监控 安全
谈谈华为数据治理的五点启示
华为数据治理为华为数字化转型的成功提供了重要基础和保障,华为数据治理的成功也成为了业界学习的标杆。
谈谈华为数据治理的五点启示
|
Java BI API
阿里华为等大厂如何实践迭代器模式的?(中)
定义:行为型,Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。) 基本不会有人业务开发使用的模式,没人会单独写一个迭代器,除非是产品性质的开发。 迭代器是为容器服务的,例如Collection、Map等,迭代器模式就是为解决遍历这些容器中的元素而生。
111 0
阿里华为等大厂如何实践迭代器模式的?(中)
|
前端开发 Java API
阿里华为等大厂如何实践迭代器模式的?(上)
定义:行为型,Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。) 基本不会有人业务开发使用的模式,没人会单独写一个迭代器,除非是产品性质的开发。 迭代器是为容器服务的,例如Collection、Map等,迭代器模式就是为解决遍历这些容器中的元素而生。
126 0
阿里华为等大厂如何实践迭代器模式的?(上)
|
Java 数据库连接 容器
阿里华为等大厂如何实践迭代器模式的?(下)
定义:行为型,Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。) 基本不会有人业务开发使用的模式,没人会单独写一个迭代器,除非是产品性质的开发。 迭代器是为容器服务的,例如Collection、Map等,迭代器模式就是为解决遍历这些容器中的元素而生。
143 0
阿里华为等大厂如何实践迭代器模式的?(下)
|
算法 安全 Serverless
何为真正的 FaaS ?阿里舜天平台做了四大创新
数据中心和云计算的超高增速,AI、视频、基因测序等应用对于算力的无尽渴求和摩尔定律发展事实上已经停滞的现实,均给异构加速带来了巨大的应用潜力和商机。但 Faas 解决方案仍有较高的门槛,今天,我们一起了解 Faas 的难度在哪里?以及在阿里,我们如何做到真正的 Faas?
1880 0
何为真正的 FaaS ?阿里舜天平台做了四大创新
|
SQL 消息中间件 缓存
Blink 有何特别之处?菜鸟供应链场景最佳实践
&gt; 作者:晨笙、缘桥 菜鸟供应链业务链路长、节点多、实体多,使得技术团队在建设供应链实时数仓的过程中,面临着诸多挑战,如:如何实现实时变Key统计?如何实现实时超时统计?如何进行有效地资源优化?如何提升多实时流关联效率?如何提升实时作业的开发效率? 而 Blink 能否解决这些问题?下面一起来深入了解。 ## 背景 菜鸟从2017年4月开始探索 Blink(即 Apache
14732 0
|
新零售 人工智能 达摩院
马云再次成功了!刚刚,阿里巴巴正式宣布再出两大产品!
马云再次成功了! 作为一家被电商才华掩盖的科技公司,阿里巴巴的技术实力我们有目共睹。 12月20日,在云栖大会.北京峰会上,阿里巴巴又甩出一个重磅—— 面向航空以及金融行业发布了ET航空大脑、ET金融大脑。
4614 0