Java23种设计模式——Iterator设计模式

从这篇开始,我开一个专栏,专门写java23中设计模式。参考文献是《图解设计模式》【日】结城浩 著 杨文轩 译 中国工信出版社和人民邮电出版社。想要了解java设计模式的推荐看看这本书。

学习设计模式的时候不用太关注类本身,而要在意于类之间的关系,设计模式的初衷不是想javaAPI那样提供具体的类来方便java程序员的使用,而是为了通过设计提高代码的复用性和扩展性。

Iterator设计模式

Iterator模式用于在数据集合中按照顺序遍历集合。这种模式的意义在哪里呢?为什么不直接用for循环语句进行遍历处理?为什么要在集合之外引入Iterator角色呢?其中最大的原因就是引入Iterator后可以将遍历和实现分离开来,并且可扩展性会很好,可以为集合写不同的Iterator迭代器(就是遍历的方式可以顺序也可以逆序等等)。
下面是模式的类图关系:
这里写图片描述

Iterator(迭代器)
:该角色定义按顺序逐个遍历元素的接口。其中hasNext方法用于判断是否存在下一个元素,next方法用于获取该元素。
Concretelterator(具体的迭代器)
:该角色负责实现Iterator角色所定义的接口。该角色宝海了遍历集合所必须的信息。
Aggregate(集合)
:该角色负责定义创建Iterator角色的接口。这个接口是一个方法,它里面定义了Iterator方法。
ConcreteAggregate(具体的集合)
:该角色负责实现Aggregate角色所定义的接口。它会创建出具体的Iterator角色。

Iterator模式实例

这里写了一个实例,供理解这种设计模式。就是给书架BookShelf上加一个迭代器BookShelfIterator,使用这种模式来实现遍历书架上的书籍Book。
设计类图如下:

这里写图片描述

Code Description

Book.java

public class Book {

    private String name;


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


    public String getName(){
        return this.name;
    }
}

BookShelf.java

public class BookShelf implements Aggregate{

    private ArrayList<Book> books;


    public BookShelf(){
        books=new ArrayList<Book>();
    }
    public Book  getBookAt(int index){
        return books.get(index);
    }
    public void appendBook(Book book){
        this.books.add(book);
    }
    public int getLength(){
        return books.size();
    }
    public Iterator iterator(){
        return new BookShelfIterator(this);
    }
}

BookShelfIterator.java

public class BookShelfIterator implements Iterator{

    private BookShelf bookShelf;
    private int index;

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


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


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


}

Iterator.java

public interface Iterator {

    boolean hasNext();
    Object next();
}

Aggregate.java

public interface Aggregate {

    Iterator iterator();
}

Main.java

public class Main {

    public static void main(String args[]){
        BookShelf bookShelf=new BookShelf();
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy Long Legs"));
        Iterator iterator=bookShelf.iterator();
        while(iterator.hasNext()){
            Book it=(Book)iterator.next();
            System.out.println(it.getName());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

angelavor

觉得有收获,给我个三连吧

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

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

打赏作者

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

抵扣说明:

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

余额充值