19【迭代器设计模式】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 19【迭代器设计模式】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


十九、迭代器设计模式

19.1 迭代器设计模式简介

19.1.1 迭代器设计模式概述

迭代器设计模式(Iterator Pattern):它提供一种按顺序访问容器中对象的元素,而又无须暴露该容器的内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内部元素的组成结构;

迭代器模式的核心是把容器中的元素的迭代抽离到迭代器中,提供一致访问的接口;

它适用于以下场景:

  • 1)访问一个容器对象的内容而无须暴露他的内部表示
  • 2)为遍历不同的容器结构提供一个统一的访问(迭代)接口

19.1.2 迭代器设计模式的UML类图

迭代器设计模式主要4个角色:

  • 1)抽象迭代器(Iterator):定义访问和遍历聚合元素的接口
  • 2)具体迭代器(ConcreteIterator):提供具体迭代的行为
  • 3)抽象容器(IAggregate):定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
  • 4)具体容器(ConcreteAggregate):对抽象容器进行实现

在这里插入图片描述

19.2 迭代器设计模式的实现

【案例】

编写一个容器,提供增、删元素的方法;并提供迭代这些元素的方法;

  • 1)编写抽象迭代器:
package com.pattern.demo01_手动实现观察者设计模式;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public interface Iterator<E> {

    E next();

    boolean hasNext();
}
  • 2)编写具体迭代器:
package com.pattern.demo01_手动实现观察者设计模式;

import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class IteratorImpl<E> implements Iterator<E> {

    // 需要迭代的容器
    private List<E> list;
    
    // 记录迭代的位置
    private int cursor = 0;
    
    // 当前迭代的元素
    private E element;

    public IteratorImpl(List<E> list) {
        this.list = list;
    }

    @Override
    public E next() {

        element = list.get(cursor);
        cursor++;

        return this.element;
    }

    @Override
    public boolean hasNext() {

        // 已经获取到list集合最大索引值
        if (cursor >= list.size()) {
            return false;
        }

        return true;
    }
}
  • 3)定义抽象容器:
package com.pattern.demo01_手动实现观察者设计模式;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public interface IAggregate<E> {
    void add(E e);
    void remove(E e);

    Iterator<E> iterator();
}
  • 4)定义具体容器:
package com.pattern.demo01_手动实现观察者设计模式;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class AggregateImpl<E> implements IAggregate<E> {

    private List<E> list;

    public AggregateImpl() {
        this.list=new ArrayList<>();
    }

    @Override
    public void add(E e) {
        list.add(e);
    }

    @Override
    public void remove(E e) {
        list.remove(e);
    }

    @Override
    public Iterator<E> iterator() {
        return new IteratorImpl<>(list);
    }
}

19.3 迭代器设计模式的优缺点

  • 优点:
    • 1)解耦了迭代与集合,迭代器模式封装了具体的迭代算法,迭代算法的变更不会影响集合本身
    • 2)元素迭代功能多样化,每个集合对象都可以提供一个或多个迭代规则,使得同种元素可以不同的迭代行为
    • 3)简化集合对象,迭代器模式将集合本身应该提供的迭代功能抽离到迭代器中,使得集合无须关心迭代行为
  • 缺点:
    • 1)增加的类的数量,增加了系统的复杂性
    • 2)对于比较简单的遍历(数组),使用迭代器将会变得比较繁琐,另外,在日常开发中,我们基本上不会自己编写迭代器,开源框架提供的API完全够用,除非需要定制一个自己实现的数据结构对应的迭代器;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131684.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!