`

大话设计模式二十:迭代器模式(想走?可以,先买票)

 
阅读更多

迭代器模式: 类似java中的Iterator类,提供一种方法顺序访问一个聚合对象中各个元素。

// 书籍类
public class Book {
	private String name = "";

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

	public String getName() {
		return name;
	}
}


// 迭代器抽象类,执行元素递增,具有类似循环变量的功能
public interface Iterator {  
    public abstract boolean hasNext();  
    public abstract Object next();  
}

// 书架迭代器类  
public class BookShelfIterator implements Iterator {

	private BookShelf bookShelf; // 书架

	private int index; // 书所在位置索引

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

	public boolean hasNext() { // 检查是否还有下一本书
		if (index < bookShelf.getLength()) {
			return true;
		} else {
			return false;
		}
	}

	public Object next() { // 返回下一位置的书
		Book book = bookShelf.getBookAt(index);
		index++;
		return book;
	}
}

// 聚集抽象类
public interface Aggregate {
	public abstract Iterator iterator();
}

// 具体聚集类
public class BookShelf implements Aggregate {
	private Book[] books;
	private int index = 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[index] = book;
		index++;
	}

	public int getLength() { // 获得书架存书的数量
		return books.length;
	}

	public Iterator iterator() { // 获得书架迭代器对象
		return new BookShelfIterator(this);
	}

}

public class Main {
	public static void main(String[] args) {
		// 生成一个书架
		BookShelf bookShelf = new BookShelf(4);
		// 向书架添加书籍
		bookShelf.appendBook(new Book("周恩来的晚年岁月"));
		bookShelf.appendBook(new Book("C++网络编程"));
		bookShelf.appendBook(new Book("J2EE网络编程精解"));
		bookShelf.appendBook(new Book("Java编程思想"));

		// 获得书架迭代器
		Iterator it = bookShelf.iterator();
		while (it.hasNext()) {
			Book book = (Book) it.next();
			System.out.println(book.getName());
		}
	}
}

总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。迭代器模式在访问数组,集合,对数据库进行操作时使用的非常普遍,由于它太普遍了,所以各种高级语言都对它进行封装,所以给人感觉此模式本身不太常用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics