设计模式之禅学习笔记--迭代器模式

一、定义

它提供一种方法访问一个容器对象中的各个元素,而不需要暴露该对象的内部细节。

二、通用类图


迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历是交由迭代器进行。

1:Iterator 抽象迭代器

抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获取第一个元素,next()访问下一个元素,isDone()是否已经访问到底部(Java叫做hasNext()方法)。

2:ConcreteInterator 具体迭代器

具体迭代器角色事项迭代器接口,完成容器元素的遍历

3:Aggregate 抽象容器类

容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法。

4:concreteAggregate 具体容器

具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。

三、通用代码

1:Iterator 抽象迭代器

public interface Iterator {
	//遍历到下一个元素
	public Object next();
	//是否已经遍历到尾部
	public boolean hasNext();
	//删除当前指向的元素
	public boolean remove();
}


2:ConcreteIterator 具体迭代器

import java.util.Vector;


public class ConcreteIterator implements Iterator {

	private Vector vector = new Vector();
	
	//定义当前游标
	public int cursor = 0;
	
	public ConcreteIterator(Vector vector) {
		this.vector = vector;
	}

	@Override
	public Object next() {
		Object result = null;
		if(this.hasNext()) {
			result = this.vector.get(this.cursor++);
		} else {
			result = null;
		}
		return result;
	}

	@Override
	public boolean hasNext() {
		if(this.cursor == this.vector.size()) {
			return false;
		} else {
			return true;
		}
	}

	@Override
	public boolean remove() {
		this.vector.remove(this.cursor);
		return true;
	}

}

3:Aggregate 抽象容器类
public interface Aggregate {

	//是容器必然有元素的添加
	public void add(Object object);
	//减少元素
	public void remove(Object object);
	//有迭代器来遍历所有元素
	public Iterator iterator();
}

4:ConcreteAggregate 具体容器

import java.util.Vector;


public class ConcreteAggregate implements Aggregate {
	//容纳对象的容器
	private Vector vector = new Vector();
	
	@Override
	public void add(Object object) {
		this.vector.add(object);
	}

	@Override
	public void remove(Object object) {
		this.remove(vector);
	}

	@Override
	public Iterator iterator() {
		return new ConcreteIterator(vector);
	}

}


5:场景类

public class Client {
	public static void main(String[] args) {
		//声明出容器
		Aggregate aggregate = new ConcreteAggregate();
		aggregate.add("abc");
		aggregate.add("aaa");
		aggregate.add("1234");
		
		//遍历一下
		Iterator iterator = aggregate.iterator();
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}

迭代器就类似于一个数据库中的游标,可以在一个容器内上下翻滚,遍历所有它需要查看的元素

四、注意点

1:迭代器模式目前已经是一个没落的模式,基本没人会单独写一个迭代器,除非是产品性质的开发。

2:开发系统时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值