设计模式(一):Iterator模式(迭代器模式)

Iterator模式(迭代器模式)

迭代器模式

需求

一个实体类Book,一个Book的集合类 BookList,BookList提供遍历方法。

实现

Book类

public class Book {
	
	private String name;
	
	public Book(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}

}

BookList类

public class BookList {

	private Book[] books;

	private int last = 0;

	private int index = 0;

	public BookList(int maxsize) {
		this.books = new Book[maxsize];
	}

	public void appendBook(Book book) {
		this.books[last] = book;
		last++;
	}

	// 返回是否还有下一个元素
	public boolean hasNext() {
		return index < last;
	}

	// 返回当前元素,指针指向下一个元素
	public Book next() {
		Book book = books[index];
		index++;
		return book;
	}

}

测试类:

@Test
public void test() {
	BookList bl = new BookList(4);
	bl.appendBook(new Book("a"));
	bl.appendBook(new Book("b"));
	bl.appendBook(new Book("c"));
	bl.appendBook(new Book("d"));
	while (bl.hasNext()) {
		Book book = bl.next();
		System.out.println(book.getName());
	}
}

上面可以完成遍历,但是耦合度太高,应采用面向接口编程的思想编码。

修改后

Book.java实体类:

public class Book {
	
	private String name;

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

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

Aggregate.java集合类接口,提供iterator方法定义:

public interface Aggregate {
	
	Iterator iterator();

}

Iterator接口,提供next和hasNext方法的定义:


/**
 * Iterator接口类
 */
public interface Iterator {

	// 返回当前元素,指针指向下一个元素,Object返回类型更具有通用性
	Object next();
	
	// 是否有下一个元素
	boolean hasNext();
	
}

BookList.java 作为Book类的集合,实现Aggregate接口:

// Book类集合
public class BookList implements Aggregate {
	
	// 用数组存储元素
	private Book[] books;
	
	// 要新添加元素的索引,也是这个集合的长度
	private int last = 0;
	
	// 初始化数组长度
	public BookList(int maxsize) {
		this.books = new Book[maxsize];
	}
	
	// 向集合BookList中添加元素(也就是向books这个数组中添加元素)
	public void appendBook(Book book) {
		this.books[last] = book;
		// 新增一个元素,长度加一
		last++;
	}
	
	// 获取集合的长度
	public int getLength() {
		// 长度,不是索引
		return last;
	}
	
	// 获取指定索引的元素
	public Book getEleAt(int index) {
		return this.books[index];
	}

	// 返回一个迭代器
	@Override
	public Iterator iterator() {
		return new BookListIterator(this);
	}

}

BookListIterator作为BookList迭代器的具体实现:

// BookList集合的迭代器
public class BookListIterator implements Iterator {
	
	private BookList bookList;
	private int index = 0;
	
	public BookListIterator(BookList bookList) {
		this.bookList = bookList;
	}

	// 返回当前元素
	@Override
	public Object next() {
		Book book = bookList.getEleAt(index);
		index++;
		return book;
	}

	@Override
	public boolean hasNext() {
		// 当前比例的索引Index小于集合长度就有下一个元素
		return index < this.bookList.getLength();
	}

}

测试:

@Test
public void mainTest() {
	BookList bookList = new BookList(4);
	bookList.appendBook(new Book("d"));
	bookList.appendBook(new Book("c"));
	bookList.appendBook(new Book("b"));
	bookList.appendBook(new Book("A"));
	Iterator iterator = bookList.iterator();
	while (iterator.hasNext()) {
		Book book = (Book)iterator.next();
		System.out.println(book.getName());
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值