面向对象设计模式_01_Iterator模式

面向对象设计模式_01_Iterator模式

面向对象设计模式_01_Iterator模式

迭代器(Iterator)模式,顾名思义就是一个一个遍历。如果具象化、特殊化成最简单的例子,可以把for循环之中的循环变量 i 的作用当成Iterator模式的一种表现形式。

for( int i = 0; i < arr.length; i++){
	System.out.println( arr[i] );
}
Iterator模式的作用

用于在数据集合对象中按照顺序遍历集合中的各个元素,而又不暴露其内部的表示。将遍历与现实分离开来,以此来降低类之间的耦合程度,但是又不影响聚合程度,进而使得类更加容易作为组件被再次利用

Iterator模式图解在这里插入图片描述
Iterator模式中的角色
  • Iterator(抽象迭代器):该角色负责 定义接口(API),用于按顺序逐个遍历元素。定义了两个最基本的方法:hasNext方法next方法,其中hasNext方法用于判断是否存在下一个元素;next方法有两个作用:将指向当前元素的 index 指向下一个元素,同时获取该元素。
  • Aggregate(抽象集合):该角色负责创建 Iterator角色的接口(API),这个被创建的接口(API)是一个iterator方法,用于创建出“按顺序访问保存在我内部元素的角色”。由于遍历功能被置于Aggregate角色外,一个Aggregate可以生成多个Iterator来进行遍历。
  • ConcreteIterator(具体的迭代器):该角色负责实现Iterator角色定义的接口(iterator角色是抽象的),包含了遍历集合所必需的信息(包括了一个ConcreteAggregate类作为字段,以及一个index字段用来标记遍历所指向的元素)。
  • ConcreteAggregate(具体的集合):该角色负责实现Aggregate角色定义的接口,所以会创建出具体的Iterator角色(ConcreteIterator),用于遍历自身。
Iterator模式类图在这里插入图片描述
Iterator模式_示例程序

情节:图书馆现有一批书,需要进行整合分析
需求:将书放置到书架上,并将书的名字按顺序显示出来
示例程序类图:在这里插入图片描述
代码:

1、Aggregate接口

package iterator_rush_Test;

public interface Aggregate {
	public abstract Iterator iterator();
}

2、Iterator接口

package iterator_rush_Test;

public interface Iterator {
	public abstract boolean hasNext();
	public abstract Object next();
}

3、Book类

package iterator_rush;

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

4、BookShelf类

package iterator_rush_Test;

public class BookShelf implements Aggregate {

	private Book[] books;
	private int last = 0;
	
	public BookShelf( int maxSize ) {
		this.books = new Book[maxSize];
		last = 0;
	}
	
	public Book getBookAt( int index ) {
		return books[index];
	}
	public void appendBook( Book book ) {
		this.books[last++] = book;
	}
	public int getLength() {
		return last;
	}
	
	//重写接口中的iterator方法
	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub
		return new BookShelfIterator(this);
	}
}

5、BoookShelfIterator类

package iterator_rush_Test;

public class BookShelfIterator implements Iterator {

	private BookShelf bookShelf;
	private int index = 0;
	
	public BookShelfIterator( BookShelf bookShelf ) {
		this.bookShelf = bookShelf;
		this.index = 0;
	}
	
	//重写接口中的hasNext方法
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		if( bookShelf.getLength() > index ) {
			return true;
		}else {
			return false;
		}
	}
	
	//重写接口中的next方法
	@Override
	public Object next() {
		// TODO Auto-generated method stub
		Book book = bookShelf.getBookAt(index);
		index ++;//指向下一个元素
		return book;
	}

}

6、测试

package iterator_rush_Test;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BookShelf bookShelf = new BookShelf(10);
		
		bookShelf.appendBook( new Book("AAAAAAAA") );
		bookShelf.appendBook( new Book("BBBBBBBBB") );
		bookShelf.appendBook( new Book("CCCCCCCCCC") );
		bookShelf.appendBook( new Book("DDDDDDDDDDD") );
		
		Iterator it = bookShelf.iterator();
		while( it.hasNext() ) {
			System.out.println(  ( (Book)it.next() ).getname()  );
		}
		
	}
	
}

7、测试结果

AAAAAAAA
BBBBBBBBB
CCCCCCCCCC
DDDDDDDDDDD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值