迭代器模式(Iterator)—牛群体检

定义:

提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。

角色列表:

迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。

具体迭代器角色(ConcreteIterator):具体迭代器角色实现迭代器接口,并记录当前的遍历位置。

容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。

具体容器角色(ConcreteContainer):具体容器角色实现创建具体迭代器角色的接口。

类图:


例子:

牛场要对牛进行体检,因此只需要通过牛群的聚合挨次对牛进行遍历,代码如下:

/**
 * 迭代器角色
 * 奶牛聚合迭代接口
 * @author wang
 */
public interface Iterator {

	public Cattle next();
	
	public boolean hasNext();
	
}

/**
 * 具体迭代器角色
 * 实现牛群的迭代接口,并记录当前的位置
 * @author wang
 */
public class ConcreteIterator implements Iterator {

	private List<Cattle> list;
	private int cursor=0;//当前游标位置
	
	public ConcreteIterator(List<Cattle> list){
		this.list = list;
	}
	
	public boolean hasNext() {
		// TODO Auto-generated method stub
		return !(cursor==list.size());
	}

	public Cattle next() {
		// TODO Auto-generated method stub
		Cattle cattle = null;
		if(hasNext()){
			cattle = list.get(cursor++);
		}
		return cattle;
	}

}

/**
 * 容器角色
 * 兽医站对牛挨个体检
 * @author wang
 */
public interface Veterinary {

	public void add(Cattle cattle);
	
	public void remove(Cattle cattle);
	
	public Iterator iterator();
	
}

/**
 * 具体容器角色
 * 实现兽医对牛的挨个体检
 * @author wang
 */
public class ConcreteVeterinary implements Veterinary {

	private List<Cattle> list;
	
	public ConcreteVeterinary(List<Cattle> list){
		this.list = list;
	}
	
	public void add(Cattle cattle) {
		// TODO Auto-generated method stub
        list.add(cattle);
	}

	public Iterator iterator() {
		// TODO Auto-generated method stub
		return new ConcreteIterator(list);
	}

	public void remove(Cattle cattle) {
		// TODO Auto-generated method stub
        list.remove(cattle);
	}

}

public class Client {

	public static void main(String args[]){
		List<Cattle> list = new ArrayList<Cattle>();
		list.add(new Cattle("一号牛"));
		list.add(new Cattle("二号牛"));
		list.add(new Cattle("三号牛"));
		list.add(new Cattle("四号牛"));
		Veterinary veterinary = new ConcreteVeterinary(list);
		Iterator iterator = veterinary.iterator();
		
		while(iterator.hasNext()){
			Cattle cattle = iterator.next();
			System.out.println("体检:" + cattle.getName());
		}
	}
	
}

public class Cattle {

	private String name;
	
	public Cattle(String name){
		this.name = name;
	}

	/**  
	 * 获取name  
	 * @return name name  
	 */
	public String getName() {
		return name;
	}

	/**  
	 * 设置name  
	 * @param name name  
	 */
	public void setName(String name) {
		this.name = name;
	}
	
}

结果如下:


优点:

1:迭代器使用方便,无需操心内部结构

2:无需关心迭代算法

其实很多数组与列表都已经实现了迭代接口,只需调用即可,真正需要用到迭代器模式的地方并不多,学习迭代器模式方便自己理解平常使用的迭代器的原理即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值