设计模式(2)之Iterator模式

一、Iterator介绍

1、适应设计模式包含Iterator模式和Adaptor模式

2、Iterator模式(迭代器模式)目的: 从含有多个元素的集合中将各个元素逐一取出来,用于在数据集合中按照顺序遍历集合

3、Iterator模式:将循环变量i的抽象化、通用化后形成的模式。

4、注意点:

    (1)抽象类和接口弱化了类之间的耦合,使类更加容易作为组件被再次利用(故优先使用接口和抽象类进行编程)
    (2)Iterator类中的next方法的作用是返回当前元素,并指向下一个元素。
    (3)Iterator类中的hasNext方法:在最后一个元素前返回true,在最后一个元素后返回false
    (4)Iterator具体类和Aggregate具体类是一一对应的
    (5)注意:没有被使用的对象实例将会自动被删除(垃圾回收、GC),所以不需要删除操作。

5、关系类图(Iterator模式)

二、代码演示

前景:使用迭代器模式遍历书架上的书籍,集合底层使用数组进行。

1、基础类(该类不在类图中)

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

    public Book(String name) {

        this.name = name;
    }

    public String getName() {
        return name;
    }
    
}

2、Aggregate角色

   

//集合接口
//Aggregate角色(集合)
public interface Aggregate {

	//生成迭代器对象
	public abstract Iterator iterator();
	
}

3、ConcreteAggregate角色

//书架------书的集合
//ConcreteAggregate角色(具体的集合)
public class BookShelf implements Aggregate{
	private Book[] books;
	private int last=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[last]=book;
		last++;
	}
	
	public int getLength() {
		return last;
	}

	@Override
	public Iterator iterator() {
		return new BookShelfIterator(this);
	}
}

4、Iterator角色

//迭代器接口
//Iterator角色(迭代器)
public interface Iterator {

	//是否存在下一个元素
	public abstract boolean hasNext();
	
	//返回当前集合的一个元素,并且移到后一个元素上
	public abstract Object next();
}

5、ConcreteIterator角色

//ConcreteIterator角色(具体的迭代器)
public class BookShelfIterator implements Iterator{
	
	private BookShelf bookShelf;

	private int index;

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

	@Override
	public boolean hasNext() {
		if(index>=0&&index<bookShelf.getLength()) {
			return true;
		}
		return false;
	}

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

6、Iterator模式测试类

public class IteratorPatternArrayListTest {
	public static void main(String[] args) {
		BookShelfArrayList list=new BookShelfArrayList(5);
		Book book1=new Book("图解设计模式");
		Book book2=new Book("深入分析JavaWeb");
		Book book3=new Book("Java高并发实战");
		list.appendBook(book1);
		list.appendBook(book2);
		list.appendBook(book3);
		Iterator iterator=list.iterator();
		while(iterator.hasNext()) {
			Book book=(Book)iterator.next();
			System.out.println("书名:"+book.getName());
		}
	}
}

三、增加新的实现()

前景:使使用迭代器模式遍历书架上的书籍,集合底层使用ArrayList进行。

1、ConcreteAggregate角色

//书架------书的集合
//ConcreteAggregate角色(具体集合)
public class BookShelfArrayList implements Aggregate{
	private ArrayList<Book>arrays;
	
	public BookShelfArrayList(int maxSize) {
		this.arrays = new ArrayList<>(maxSize);
	}

	//获得某个位置的书
	public Book getBookAt(int index) {
		return arrays.get(index);
	}
	
	//在末尾添加一本书
	public void appendBook(Book book) {
		this.arrays.add(book);
	}
	
	public int getLength() {
		return arrays.size();
	}

	@Override
	public Iterator iterator() {
		return new BookShelfIteratorArrayList(this);
	}
}

2、ConcreteIterator角色  

//ConcreteIterator角色(具体的迭代器)
public class BookShelfIteratorArrayList implements Iterator{
	
	private BookShelfArrayList list;

	private int index;

	public BookShelfIteratorArrayList(BookShelfArrayList list) {
		this.list=list;
		this.index=0;
	}

	@Override
	public boolean hasNext() {
		if(index>=0&&index<list.getLength()) {
			return true;
		}
		return false;
	}

	@Override
	public Object next() {
		Book book=list.getBookAt(index);
		index++;
		return book;
	}
}

3、对应的测试类

public class IteratorPatternArrayListTest {
	public static void main(String[] args) {
		BookShelfArrayList list=new BookShelfArrayList(5);
		Book book1=new Book("图解设计模式");
		Book book2=new Book("深入分析JavaWeb");
		Book book3=new Book("Java高并发实战");
		list.appendBook(book1);
		list.appendBook(book2);
		list.appendBook(book3);
		Iterator iterator=list.iterator();
		while(iterator.hasNext()) {
			Book book=(Book)iterator.next();
			System.out.println("书名:"+book.getName());
		}
	}
}

转载请声明出处,谢谢。

猜你喜欢

转载自blog.csdn.net/tree_ifconfig/article/details/81146253
今日推荐