从这篇开始,我开一个专栏,专门写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());
}
}
}