首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-迭代器模式

设计模式-迭代器模式

作者头像
逍遥壮士
发布2020-09-18 11:27:05
5730
发布2020-09-18 11:27:05
举报
文章被收录于专栏:技术趋势技术趋势

背景

每次想起学生时代,经常性点名,第头来,第尾来,乱来,呵呵,老师的点名方式五花8门...而点这种就类似到遍历,我们设计模式中的迭代器一样的逻辑,从头到尾或按照想要的规则来...

迭代器模式是什么?

迭代器模式(Iterator Pattern)属于行为型模式。提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

角色:

Iterator:迭代器接口。定义访问和遍历元素的接口。

ConcreteIterator:具体的迭代器实现对象。实现取聚合对象的遍历,并跟踪遍历时的当前位置。

Aggregate:聚合对象。定义创建相应迭代器对象的接口。

ConcreteAggregate:具体聚合对象。实现创建相应的迭代器对象。

迭代器模式可以干嘛?

迭代器,以一个统一的方式来访问内部实现不同的取合对象。主要解决一个数据元素遍历问题,还有如何遍历。将需要遍历的元素放到池中,然后根据所需的遍历方式进行遍历。

本质:”控制访问聚合对象中的元素“。

优点:

高内聚:将数据聚合为一个容器中,以不同方式遍历。

单一责职:容器是负责存放数据、而遍历是负责打印数据,这样就是即解耦又责职单一。

开闭原则:很好的遵循该点,因为新增的遍历方式不影响现有的遍历方式,可以不断拓展新的遍历方式;

缺点:

增加系统复杂度:由于迭代的算法可以不断新增,所以会造成每一个新算法可以新增一个类,会导致系统复杂度会变高。

个人理解:

迭代,就类似于点名,而学生全部在班级里面,属于容器(container),班级是一个容器,学生属于每一个元素,老师点名的方式就是迭代的方法,从头到尾,从尾到头...

迭代器模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/**
 * @Auther: csh
 * @Date: 2020/6/9 10:17
 * @Description:迭代抽象接口(Iterator)
 */
public interface Iterator {
    //遍历所有元素
    void printElements();
}
/**
 * @Auther: csh
 * @Date: 2020/6/9 10:18
 * @Description:数据容器接口(Container)
 */
public abstract class Container {
    //容器数据
    public  abstract void setContainer(List list);
}
/**
 * @Auther: csh
 * @Date: 2020/6/9 10:21
 * @Description:迭代实现(ConcreteIterator)
 */
public class IteratorImpl extends Container implements Iterator {
    //聚合对象(Aggregate)
    private List list =new ArrayList();


    @Override
    public void printElements() {
        if(null!=list){
            for (Object o : list) {
                System.out.println(o);
            }
        }
    }

    @Override
    public void setContainer(List list) {
        this.list =list;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/9 10:29
 * @Description:班级点名
 */
public class Client {
    public static void main(String[] args) {
        //具体的对象 ConcreteAggregate
        String concreteAggregate =  "小明,小红,小芳,小丽,小娟,小军,小刚,小强,小方,晓明,晓红,晓芳,晓丽,晓娟,晓军,晓刚,晓强,晓方";
        String[] arr = concreteAggregate.split(",");
        List list = new ArrayList(Arrays.asList(arr));
        IteratorImpl iterator = new IteratorImpl();
        iterator.setContainer(list);
        iterator.printElements();
    }
}

结果

小明
小红
小芳
小丽
小娟
小军
小刚
小强
小方
晓明
晓红
晓芳
晓丽
晓娟
晓军
晓刚
晓强
晓方

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

本例是通过for基础上去实现的,主要为传播迭代器的一种思想,具体怎么实现其实在很多实际工作中不是很重要,重要的是基本的实现原理思想和选型。迭代器在jdk中到处应用,for arrylist linklist等等,该模式还是比较简单,复杂在具体基础上去应用一些算法。

java的迭代器

Iterable

list

set

....

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档