wxvirus wxvirus
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

无解的lifecycle

let today = new Beginning()
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • 刷题

  • 博客搭建

  • 算法学习

  • 架构设计

  • 设计模式

    • Iterator模式
      • Demo:将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来
      • 迭代器接口
      • 书架类和书实体类
      • 实现WxIterator的方法
      • 测试类
    • 单例模式
    • 策略模式
  • 技术
  • 设计模式
wxvirus
2022-11-06

Iterator模式

# Iterator 模式

一般用于多数据遍历。

在使用 Java 语言显示数组arr元素时,我们大部分时候使用for循环遍历数组

for (int i = 0; i < arr.length; i++) {
   System.out.printlne(arr[i]);
}
1
2
3

将这里的循环变量i的作用抽象化、通用化后形成的模式,在设计模式中成为Iterator模式。Iterator模式用于在数据集合中按照顺序遍历集合。

# Demo:将书(Book)放置到书架(BookShelf)中,并将书的名字按顺序显示出来

Aggregate接口:是所要遍历的集合的接口。实现了该接口的类将成为一个可以保存多个元素的集合。

image-20221105204942011

package demo.bookself;

/**
 * 表示集合的接口
 */
public interface Aggregate {
    public abstract WxIterator iterator();
}

1
2
3
4
5
6
7
8
9

这个接口中声明的方法只有一个iterator的方法,该方法会生成一个用于遍历集合的迭代器。这里我修改了一个迭代器接口的名称为WxIterator用于区分和java已有的

package demo.bookself;

/**
 * 表示遍历集合的接口
 */
public interface WxIterator {
    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     * @return boolean
     */
    public abstract boolean hasNext();

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     * @return Object
     */
    public abstract Object next();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

WxIterator相当于上面for循环的循环变量,我们定义 2 个方法

  • 判断是否有下一个元素

    这个方法的返回值是boolean,当集合中存在下一个元素时,返回true;当集合中不存在下一个元素时,即已经遍历至集合末尾时,该方法返回false;hasNext方法主要用于循环终止条件。

  • 获取下一个元素,并将迭代器移动到下一个位置。

# 迭代器接口

package demo.bookself;

/**
 * 表示遍历集合的接口
 */
public interface WxIterator {
    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     * @return boolean
     */
    public abstract boolean hasNext();

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     * @return Object
     */
    public abstract Object next();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 书架类和书实体类

package demo.bookself;

/**
 * 书的实体类
 */
public class Book {
    private String name;

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

    public String getName() {
        return name;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package demo.bookself;

/**
 * 表示书架的类
 */
public class BookSelf implements Aggregate {

    private Book[] books;
    private int last = 0;

    public BookSelf(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 WxIterator iterator() {
        return new BookSelfIterator(this);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 实现WxIterator的方法

package demo.bookself;

/**
 * 遍历书架的类
 */
public class BookSelfIterator implements WxIterator {
    private BookSelf bookSelf;
    private int index;

    public BookSelfIterator(BookSelf bookSelf) {
        this.bookSelf = bookSelf;
        this.index = 0;
    }

    /**
     * 判断是否有下一个元素
     * 主要用于终止循环
     *
     * @return boolean
     */
    @Override
    public boolean hasNext() {
        return index < bookSelf.getLength();
    }

    /**
     * 获取下一个元素
     * 包含迭代器移动至下一个元素的位置
     *
     * @return Object
     */
    @Override
    public Object next() {
        Book book = bookSelf.getBookAt(index);
        index++;
        return book;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 测试类

package demo.bookself;

public class Main {
    public static void main(String[] args) {
        BookSelf bookSelf = new BookSelf(4);
        bookSelf.appendBook(new Book("Around the world in 80 days"));
        bookSelf.appendBook(new Book("Bible"));
        bookSelf.appendBook(new Book("Cinderella"));
        bookSelf.appendBook(new Book("Daddy-Long-Legs"));
        WxIterator it = bookSelf.iterator();
        while (it.hasNext()) {
            Book book = (Book) it.next();
            System.out.println(book.getName());
        }
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编辑 (opens new window)
#iterator
上次更新: 2022/11/06, 16:58:13
用户中心
单例模式

← 用户中心 单例模式→

最近更新
01
centos7安装redis6文档记录
02-14
02
portainer的安装
02-11
03
gin自定义验证器和翻译器
02-11
更多文章>
Theme by Vdoing | Copyright © 2021-2023 wxvirus
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式