【行为型】迭代器模式

文章展示了如何在Java中实现迭代器模式,通过定义接口`Aggregate`和`Iterator`,以及具体实现`BookShelf`和`BookShelfIterator`,实现了对书籍集合的遍历。迭代器模式允许在不暴露内部结构的情况下访问聚合对象,提高了代码的灵活性和可扩展性。测试类`Main`演示了如何使用迭代器遍历书架上的书籍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 只声明一个方法,为了建立一个可对应聚合的Iterator
 * @date 2023/5/29下午 4:08
 */
public interface Aggregate {
    /**
     * 在进行递增、遍历或者检查某个聚合时,利用 iterator 方法即可建立一个实现 Iterator 接口的类对象实例
     * @return
     */
     abstract Iterator iterator();
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 执行元素递增
 * @date 2023/5/29下午 4:09
 */
public interface Iterator {
    /**
     * 检查是否有下一元素
     * boolean 是结束与继续的条件
     * @return
     */
    abstract boolean hasNext();

    /**
     * 取得 下一元素
     * @return
     */
    abstract Object next();
}

 package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 书籍类
 * @date 2023/5/29下午 4:09
 */
public class Book {
    private String name = "";

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

package com.fly.patterns.iterator;

import java.util.Vector;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 书架作用类; 要实现 Aggregate 接口 才能把本类当做聚合来处理。
 * @date 2023/5/29下午 4:39
 */
public class BookShelf implements Aggregate {
//    // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
//    private Book[] books;
//    private int last = 0;
//
//    public BookShelf(int maxsize){
//        this.books = new Book[maxsize];
//    }
//
//    public Book getBookAt(int index){
//        return books[index];
//    }
//
//    public void appendBook(Book book){
//        this.books[last] = book;
//        last++;
//    }
//
//    public int getLength(){
//        return last;
//    }
//
//    @Override
//    public Iterator iterator() {
//        return new BookShelfIterator(this);
//    }


    // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
    private Vector<Book> books;
    private int last = 0;

    public BookShelf(int maxsize){
        this.books = new Vector<>(maxsize);
    }

    public Book getBookAt(int index){
        return books.get(index);
    }

    public void appendBook(Book book){
        books.add(last,book);
        last++;
    }

    public int getLength(){
        return last;
    }

    @Override
    public Iterator iterator() {
        return new BookShelfIterator(this);
    }
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 扫描 BookShelf类的类
 * @date 2023/5/29下午 4:44
 */
public class BookShelfIterator implements Iterator {

    /**  要扫描的书架  */
    private BookShelf bookShelf;
    /**  书架的下标  */
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}

package com.fly.patterns.iterator;

/**
 * @author fei.chen
 * @projectName design-patterns
 * @description: 测试类
 * @date 2023/5/29下午 4:49
 */
public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("第1本书 《我的世界》"));
        bookShelf.appendBook(new Book("第2本书 《世界简史》"));
        bookShelf.appendBook(new Book("第3本书 《人类监视》"));
        bookShelf.appendBook(new Book("第4本书 《动物世界》"));

        Iterator iterator = bookShelf.iterator();
        while (iterator.hasNext()){
            Book book = (Book)iterator.next();
            System.out.println(book.getName());
        }

    }
}

迭代器模式

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。它允许您以一种更灵活、可扩展的方式遍历集合对象。这种模式通过提供一个迭代器(Iterator)来遍历集合对象,而不是直接访问集合中的元素。迭代器模式有助于降低代码的耦合度,并使代码更易于维护和扩展。

  • Aggregate(聚合) 已聚合的接口
  • ConcreteIterator(具体集合)
  • Iterator(迭代器) 执行递增、遍历的接口
  • BookShelfIterator(具体的迭代器) 扫描书架的类
  • Book 书籍类
  • BookShelf 书架类
  • Main 测试类

这里面其实只用到了iterator的 hasNext next 两个方法,不会受到具体BookShelf类的影响,
目前是用数组实现管理书籍,假如之后想改用其他集合比如List或者Vector,无论怎么修改,只要能反正
正确的 iterator 就好。下面代码一点也不需要改动。

while (iterator.hasNext()){
    Book book = (Book)iterator.next();
    System.out.println(book.getName());
}

使用场景:

1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口。

注意事项:

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

总结

设计迭代器模式的目的就是提高类的复用率,就是把类当做一个零部件使用,只要修改某一个零部件,就不需要在费力的去修改其他的零部件。

所以我们在设定程序的时候不把方法 iterator 的返回值 写死 成 BookShelfIterator 类的变量,
而是指定到 Iterator 里面,我们不是要利用BookShelfIterator 去实现程序,而是利用 Iterator 的方法来实现程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

飞四海

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

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

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

打赏作者

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

抵扣说明:

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

余额充值