java设计模式--迭代器模式
迭代器模式迭代器模式又称游标模式是对象行为型模式,主要是为了提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露聚合对象的内部结构。说到迭代器,我们都很熟悉,例如HashSet中如果我们需要遍历HashSet中的每个元素则需要通过Iterate不停的next()后来遍历,那么通过Iterator来遍历集合中的元素有什么好处呢?很明显我们在不知道HashSet的具体实现时,我们也可以通过Iterator来遍历集合,所以使用者不需要关心HashSet内部的实现也不需要关系遍历的规则,那么同时设计者也可以随意的改动遍历规则而不影响使用者的使用。 ? 迭代器模式的适用性
? 迭代器模式的结构图? 迭代器模式中总共分为4类角色: 1、抽象迭代器角色(Iterator):定义了访问和遍历聚合元素的接口。 2、具体迭代器角色(ConcreteIterator):实现迭代器接口,并且记录遍历中的当前位置。 3、抽象聚合角色(Aggregate):负责提供创建具体迭代器角色的接口。 4、具体聚合角色(ConcreteAggregate):实现创建相应迭代器的接口,该操作返回一个合适的具体迭代器角色。 ? 迭代器模式的示例抽象聚合角色,负责定义好聚合角色的增加、删除和返回迭代器的方法的接口。 public interface Aggregate { public void add(Object object); public void remove(Object object); public Iterator creteIterator(); } 具体聚合角色,实现抽象聚合角色定义的接口,同时提供CreateIterator()方法返回遍历该对象的迭代器。 public class ConcreteAggregate implements Aggregate { List<Object> list = new ArrayList<>(); @Override public void add(Object object) { this.list.add(object); } @Override public void remove(Object object) { this.list.remove(object); } @Override public Iterator creteIterator() { return new ConcreteIterator(this.list); } } 抽象迭代器角色,定义遍历聚合对象的next()、hasNext()方法,同时提供能操作聚合对象元素的remove方法。 public interface Iterator { public Object next(); public boolean hasNext(); public boolean remove(); } 具体迭代器角色 public class ConcreteIterator implements Iterator { private List<Object> list; int index = 0; public ConcreteIterator(List<Object> list) { this.list = list; } @Override public Object next() { return list.get(index++); } @Override public boolean hasNext() { return index < list.size(); } @Override public boolean remove() { this.list.remove(index); return true; } } 客户端调用 public class Client { public static void main(String[] args) { Aggregate aggregate = new ConcreteAggregate(); aggregate.add("aaa"); aggregate.add(123); aggregate.add(‘a‘); Iterator iterator = aggregate.creteIterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } } /* 运行结果: aaa 123 a */ ? ?迭代器模式的优缺点 1、迭代器模式提供了一个便捷的方式遍历集合中的各元素。 2、可以通过修改迭代器的实现方式实现正序、倒序等多种开发者想提供的遍历方式。 3、通过使用迭代器,用户可以只需要拿到迭代器就可以遍历,而不需要关心迭代器是如何实现的。 4、如果有比较简单的遍历方式,例如数组、List这些,那么尽量使用简单的方式遍历就可以了,因为使用迭代器来遍历对象的效率普遍不是很高。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |