初探设计模式之Iterator模式

设计模式之迭代模式

迭代模式是设计模式中较为简单的一种设计模式


一、什么是迭代(Iterator)模式

迭代器模式:在java的for循环中,我们经常会使用循环变量,借此来遍历数组,比如说经常用到的变量i。i在每次循环后都会自增或自减,这样就实现了对数组的遍历。我们将循环变量i的作用抽象化,通用化后形成的模式称为迭代(Iterator)模式。

iterator
1.Iterator(迭代器):负责定义按顺序逐个遍历元素的API。
2.ConcreteIterator(具体的迭代器):负责定义实现Iterator角色所定义的API。
3.Aggregate(集合):负责定义创建Iterator角色的API。
4.ConcreteAggregate(具体的集合):负责实现Aggregate所定义的API。

二、具体实例

我们使用书(Book)与书架(BookShelf)的关系来探索迭代模式。
具体过程是将书放到书架中,然后取书。

1.定义Book类

代码如下:

package com.wwh.iterator_model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private String name;
}

2.定义Iterator(迭代器)与Aggregate(集合)接口

Iterator:

package com.wwh.iterator_model;

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

Aggregate:

package com.wwh.iterator_model;

public interface Aggregate {
    public abstract Iterator iterator();
}

3.定义BookShelf类(相当于ConcreteAggregate)

代码如下:

package com.wwh.iterator_model;

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

public class BookShelf implements Aggregate{

    List<Book> books = null;

    BookShelf(int initialsize){
        books = new ArrayList<>(initialsize);

    }

    public Book getBookAt(int index){


        return (Book)books.get(index);
    }


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

    public int getLength(){
        return books.size();
    }

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

4.定义BookShelfIterator(相当于ConcreteIterator)

代码如下:

package com.wwh.iterator_model;

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

public class BookShelfIterator implements Iterator{
    private BookShelf bookShelf;
    private int index;
    private List<Book> bookList;

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

    @Override
    public boolean hasNext() {
        if (index < bookList.size()){
            return true;
        }
        return false;
    }

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

三、实例分析

concreteiterator
如上图所示,BookShelf是具体的集合,可以完成取书,放书,查总数;BookShelfIterator是具体的迭代器,用来遍历BookShelf,其中的hasNext和next方法就是完成迭代的方法。通过hasNext判断是否还有书,使用next拿到下一本书。


结果+测试

package com.wwh.iterator_model;

public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("安徒生童话"));
        bookShelf.appendBook(new Book("伊索寓言"));
        bookShelf.appendBook(new Book("灰姑娘"));
        bookShelf.appendBook(new Book("白雪公主"));
        Iterator iterator = bookShelf.iterator();
        while (iterator.hasNext()){
            System.out.println(((Book)iterator.next()).getName());
        }
        System.out.println("--------------------------------------");
        System.out.println(((Book)bookShelf.getBookAt(2)).getName());
    }
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值