设计模式是开发者前辈们给我们后背的一个经验总结。有效的使用设计模式,能够帮助我们编写可复用的类。所谓“可复用”,就是指将类实现为一个组件,当一个组件发生改变时,不需要对其他组件进行修改,或者只需要修改很小一部分即可。
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
下面是一段实现了迭代器模式的示例程序,这段程序作用是,将书BOOK放到书架中BookShelf,并且采用迭代器的方式进行遍历,将书名按照顺序显示出来:
- Aggregate接口,作为自定义集合的顶层接口。
package site.wangxin520.gof.iterator; /** * 定义表示集合的接口,有一个iterator方法,用于返回一个Iterator类 * @author wangXgnaw * */ public interface Aggregate { /** * 集合的获取迭代器方法,用于返回一个迭代器对象 * @return Iterator 返回一个迭代器对象 */ public Iterator iterator(); }
- Iterator迭代器的顶层父接口
package site.wangxin520.gof.iterator; /** * 这个是迭代器的类,里面有两个方法,hasnext和next * @author wangXgnaw * */ public interface Iterator { /** * 判断是否有下一个元素,通常使用在while进行遍历 * @return boolean */ public boolean hasNext(); /** * 返回当前指针指向的元素,并且把指针指向下一个元素 * @return Object 返回一个对象,集合的单个元素对象 */ public Object next(); }
- BookShelf书架的类,实现了集合的接口
package site.wangxin520.gof.iterator; import java.util.ArrayList; /** * 用于表示书架用的类,实现了集合的这个接口。 实际在Java中,集合的顶层接口也是同样的方式。 * * @author wangXgnaw * */ public class BookShelf implements Aggregate { /** * 集合,用于保存书的 */ private ArrayList<Book> list = new ArrayList<Book>(); /** * 获取到书架的大小 * * @return int */ public int size() { return list.size(); } /** * 往书架里面放书 * @param book */ public void putBook(Book book) { list.add(book); } /** * 根据序号,从书架里面取书 * * @param index * @return Book */ public Book getBook(int index) { return list.get(index); } public Iterator iterator() { return new BookShelfIterator(this); } }
- 书架的迭代器实现,这需要自己定义,以实现迭代器接口定义的方法。
package site.wangxin520.gof.iterator; /** * 书架的一个迭代器 * @author wangXgnaw * */ public class BookShelfIterator implements Iterator{ /** * 书架属性,用于对迭代器进行操作需要的。 */ private BookShelf bookShelf; /** * 当前指针指向的位置 */ private int index=0; /** * 书架类迭代器的构造函数 * @param bookShelf */ public BookShelfIterator(BookShelf bookShelf){ this.bookShelf=bookShelf; } public boolean hasNext() { if(index<bookShelf.size()){ return true; } return false; } public Object next() { //获取指定编号的书 Book book = bookShelf.getBook(index); //指针向下移动一个 index++; return book; } }
- Book书的实体类
package site.wangxin520.gof.iterator; /** * 书的实体类 * @author wangXgnaw * */ public class Book { /** * 数的名字 */ private String bookName; /** * 书本的构造函数,传入书本的名字。 * @param name */ public Book(String name){ this.bookName=name; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } }
- 测试方法
package site.wangxin520.gof.iterator; /** * 迭代器模式的测试方法 * @author wangXgnaw * */ public class IteratorTest { public static void main(String[] args) { //获得一个书柜 BookShelf bs=new BookShelf(); //往书柜里面放书 bs.putBook(new Book("红楼梦")); bs.putBook(new Book("西游记")); bs.putBook(new Book("三国演义")); bs.putBook(new Book("水浒传")); //使用迭代器,依次获取到书柜中书的名字 Iterator iterator = bs.iterator(); while (iterator.hasNext()) { Book nextBook = (Book) iterator.next(); String bookName = nextBook.getBookName(); System.out.println(bookName); } } }
- 最后的结果: