Java设计模式-迭代器模式

最近学习到设计模式,现总结个人学习迭代器模式内容【注重的是不同集合的统一遍历问题】。
上一篇:Java设计模式-访问者模式

定义

提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。(例如测试中的遍历方法,对List和Array的遍历)

优缺点

优点

  • 访问一个聚合对象的内容而无需暴露它的内部表示
  • 支持对聚合对象的多种遍历
  • 单一责任原则
  • 为遍历不同的聚合结构提供一个统一的接口

缺点

每一个聚合对象(如这里的用户)都要一个迭代器,会生成多个迭代器不便于管理,[如果添加一个房子对象,则需要创建对应的迭代器,迭代器会剧增不便于管理]

实现

在这里插入图片描述

迭代器模式的角色

  • Iterator(迭代器)【如下的MyIterator】:迭代器定义访问和遍历元素的接口.
  • ConcreteIterator 具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置.
  • Aggregate (聚合):聚合定义创建相应迭代器对象的接口.
  • ConcreteAggregate 具体聚合)【如下的刚需】:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.

代码

代码测试用到的对象

/**
 * 购房者
 * @author cc百川
 */
public class User {
	public String name;
	public String des;
	public User(String name, String des) {
		this.name = name; this.des = des;
	}
}

定义迭代器接口,以及具体的迭代器

/** 为了减少篇幅统一处理了格式,建议复制带或用格式刷统一处理一下 
 * 迭代器接口
 * @author cc百川
 */
public interface MyIterator {
	public abstract boolean hasNext();
    public abstract Object next();
}
/**
 * 刚需数组购房迭代器
 * @author cc百川
 */
class RigidDemandArrayIterator implements MyIterator{
	private User [] users;
	private int index; 
	public RigidDemandArrayIterator(User[] users) {
		this.users = users; this.index = 0;
	}
	@Override
	public boolean hasNext() {
		if(index<users.length && users!=null && users[index]!=null){ return true;
		} else { return false; }
	}
	@Override
	public Object next() { return  users[index++]; }	
}
/**
 * 刚需List集合户购房迭代器
 * @author cc百川
 */
class RigidDemandListIterator implements MyIterator{
	private List<User> users;
	private int index;
	//构造方法初始化数据
	public RigidDemandListIterator(List<User> users ) {
		this.users = users;		this.index = 0;
	}
	@Override //判断是否存在数据
	public boolean hasNext() {
		if(index<users.size() && users!=null && users.get(index)!=null){
			return true;
		} else {return false;}
	}
	@Override //获取数据
	public Object next() {return users.get(index++);}
}

集合接口以及相关实现类

/**
 * 集合接口统一定义了集合的行为
 * @author cc百川
 */
public interface Aggregate {
	public String getName();
	//增加用户的方法
	public void addUser(String name, String phone);
	//返回一个迭代器,遍历
	public MyIterator createIterator();
}
/**
 * 数组集合
 * @author cc百川
 */
class ArrayImpl implements Aggregate{
	private User [] users;
	private int index ;
	public ArrayImpl(User[] users) {
		this.users = users;index= 0;
	}
	public ArrayImpl(){this(new User[10]);}
	@Override
	public String getName() {return "数组方式的集合";}
	@Override
	public void addUser(String name, String des) {
		this.users[index++]=new User(name, des);
	}
	@Override
	public MyIterator createIterator() {return new RigidDemandArrayIterator(users);}
}
/**
 * List集合
 * @author cc百川
 */
class ListImpl implements Aggregate{
	private List<User> users; 
	//无参合有参构造方法
	public ListImpl(List<User> users) {
		this.users = users;  ;
	}
	public ListImpl(){this(new ArrayList<User>());}
	@Override //改方法仅用来测试
	public String getName() { return "list集合方式的集合"; }
	@Override //给集合添加元素
	public void addUser(String name, String des) {
		this.users.add(new User(name, des));
	}
	@Override //获取迭代器对象
	public MyIterator createIterator() {
		return new RigidDemandListIterator(this.users);
	}
}

测试

public class Test {
	public static void main(String[] args) {
		ArrayImpl rda = new ArrayImpl();
		System.out.println("======"+rda.getName()+"======");
		rda.addUser("孙悟空", "花果山被牛魔王占领了");
		rda.addUser("猪八戒", "高老庄孙悟空给毁了");
		rda.addUser("沙悟净", "流沙河转让了");
		
		MyIterator array =  rda.createIterator();
		while(array.hasNext()) {
			User user = (User) array.next();
			System.out.println("购房者是"+user.name+", 购房原因是:"+user.des);
		}
		
		ListImpl rdl = new ListImpl();
		System.out.println("======"+rdl.getName()+"======");
		rdl.addUser("诸葛亮", "刘备请我去当军师,决定在成都购买套三,方便上下班");
		rdl.addUser("曹操", "因为我挟持了天子,给他买个房当门面,免得刘备说我不忠于汉室。");
		rdl.addUser("小乔", "战争年代小女子在乡下不容易,想买一个城里的房子");
		MyIterator list =  rdl.createIterator();
		while(list.hasNext()) {
			User user = (User) list.next();
			System.out.println("购房者是"+user.name+", 购房原因是:"+user.des);
		}
	}
}

在这里插入图片描述


迭代器模式重点在于对不同集合的统一进行遍历。
以上仅为个人学习,如果错误望指出,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值