聊聊设计模式——迭代器模式

目录

迭代器模式:行为型设计模式

优点

缺点

结构说明

工作流程

代码练习

应用场景

本质

涉及的设计原则

相关设计模式

开源框架中的应用


迭代器模式:行为型设计模式

        提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。

优点

  1. 分离了集合对象和遍历逻辑:迭代器模式将集合对象的内部结构和遍历逻辑分离,使得集合对象更加简化,同时提供了一种统一的遍历方式。

  2. 支持多种遍历方式:迭代器模式可以支持不同的遍历方式,例如顺序遍历、逆序遍历等,而不需要修改聚合对象。

  3. 可扩展性:通过添加新的具体迭代器类,可以轻松扩展迭代器模式,以支持新的遍历方式。

缺点

  1. 增加了复杂性:引入迭代器模式可能会增加代码的复杂性,因为需要定义迭代器接口和具体迭代器类。

结构说明

  1. 迭代器接口(Iterator Interface):定义了访问和遍历聚合对象元素的方法,通常包括 next(获取下一个元素)和 hasNext(检查是否还有下一个元素)等方法。

  2. 具体迭代器(Concrete Iterator):实现迭代器接口,负责实现具体的迭代逻辑,包括追踪当前位置、获取下一个元素等。

  3. 聚合接口(Aggregate Interface):定义了创建迭代器对象的方法,通常包括 createIterator 等方法。

  4. 具体聚合类(Concrete Aggregate):实现了聚合接口,负责创建具体的迭代器对象,并提供对聚合元素的访问方式。

工作流程

  1. 客户端通过聚合对象的工厂方法(如 createIterator)获取迭代器对象。

  2. 客户端使用迭代器对象来遍历聚合对象的元素,通过调用 next 方法获取下一个元素,通过 hasNext 方法检查是否还有下一个元素。

  3. 迭代器对象内部维护了对聚合对象的引用,以便能够顺序访问聚合对象的元素。

代码练习

        当我们需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。

1.创建迭代器接口,有两种定义方式,此处采用的是方式一:

// 接口定义方式一
public interface Iterator<T> {
    boolean hasNext();
    E next();
}
public interface Iterator<T> {
    boolean hasNext();
    void next();
    E currentItem();
}

2.创建具体迭代器

public class ConcreteIterator<T> implements Iterator<T>{
    private List<T> collection;
    private int index;
​
    public ConcreteIterator(List<T> collection){
        this.collection = collection;
        this.index =0;
    }
    @Override
    public boolean hasNext() {
        return index < collection.size();
    }
​
    @Override
    public T next() {
        if (hasNext()){
            T item = collection.get(index);
            index++;
            return item;
        }
        return null;
    }
}

3.创建聚合接口,主要是定义创建迭代器的方法

public interface Aggregate<T> {
    Iterator<T> createIterator();
}

4.创建具体聚合类,创建迭代器对象,提供对聚合元素的访问方式

public class ConcreteAggregate<T> implements Aggregate{
    private List<T> collection;
​
    public ConcreteAggregate(){
        this.collection = new ArrayList<>();
    }
​
    public void addItem(T item){
        this.collection.add(item);
    }
​
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(collection);
    }
}

5.客户端遍历

public class IteratorClient {
    public static void main(String[] args) {
        ConcreteAggregate<Integer> aggregate = new ConcreteAggregate<>();
        aggregate.addItem(1);
        aggregate.addItem(2);
        aggregate.addItem(3);
​
        Iterator<Integer> iterator = aggregate.createIterator();
        while (iterator.hasNext()){
            Integer item = iterator.next();
            System.out.println(item);
        }
    }
}

应用场景

  1. 当需要以统一的方式访问不同类型的聚合对象(如列表、树、图等)的元素时,可以考虑使用迭代器模式。

  2. 当需要隐藏聚合对象的内部表示,并提供一种统一的访问方式时,迭代器模式非常有用。

  3. 当需要在不依赖聚合对象的具体类的情况下遍历聚合对象的元素时,可以使用迭代器模式。

本质

迭代器模式的本质是提供一种统一的方式来访问聚合对象的元素,将迭代逻辑封装到迭代器对象中。

涉及的设计原则

  1. 单一职责原则(Single Responsibility Principle):迭代器模式将迭代逻辑从聚合对象中分离出来,使得每个类都有一个单一的职责。

相关设计模式

  • 迭代器模式通常与职责链模式(Chain of Responsibility Pattern)结合使用,以实现复杂的过滤和遍历逻辑。

开源框架中的应用

  1. Java中的迭代器:Java中的集合框架(如ArrayList、HashSet等)都提供了内置的迭代器,可以用于遍历集合中的元素。

  2. .NET中的LINQ:Language-Integrated Query(LINQ)是.NET框架中的一个功能,它允许使用类似SQL的查询语言来查询集合数据,背后使用了迭代器模式。

  3. Spring框架 - 数据访问:Spring框架中的JdbcTemplate使用了迭代器模式来遍历数据库查询结果集。

  4. Android中的Cursor:在Android中,Cursor对象用于遍历数据库查询结果,实际上是迭代器模式的应用。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elaine202391

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值