顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:
这个思路和我们常用的一模一样,MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,我们来看看实现代码:
两个接口:
[java] view plaincopy
- public interface Collection {
- public Iterator iterator();
- /*取得集合元素*/
- public Object get(int i);
- /*取得集合大小*/
- public int size();
- }
[java] view plaincopy
- public interface Iterator {
- //前移
- public Object previous();
- //后移
- public Object next();
- public boolean hasNext();
- //取得第一个元素
- public Object first();
- }
两个实现:
[java] view plaincopy
- public class MyCollection implements Collection {
- public String string[] = {"A","B","C","D","E"};
- @Override
- public Iterator iterator() {
- return new MyIterator(this);
- }
- @Override
- public Object get(int i) {
- return string[i];
- }
- @Override
- public int size() {
- return string.length;
- }
- }
[java] view plaincopy
- public class MyIterator implements Iterator {
- private Collection collection;
- private int pos = -1;
- public MyIterator(Collection collection){
- this.collection = collection;
- }
- @Override
- public Object previous() {
- if(pos > 0){
- pos--;
- }
- return collection.get(pos);
- }
- @Override
- public Object next() {
- if(pos<collection.size()-1){
- pos++;
- }
- return collection.get(pos);
- }
- @Override
- public boolean hasNext() {
- if(pos<collection.size()-1){
- return true;
- }else{
- return false;
- }
- }
- @Override
- public Object first() {
- pos = 0;
- return collection.get(pos);
- }
- }
测试类:
[java] view plaincopy
- public class Test {
- public static void main(String[] args) {
- Collection collection = new MyCollection();
- Iterator it = collection.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
输出:A B C D E
此处我们貌似模拟了一个集合类的过程,感觉是不是很爽?其实JDK中各个类也都是这些基本的东西,加一些设计模式,再加一些优化放到一起的,只要我们把这些东西学会了,掌握好了,我们也可以写出自己的集合类,甚至框架!
==================================================================
下面看迭代子的另外一个例子:
package my; public class Test { public static void main(String[] args) { Stack s = new Stack(); s.push("Liucy"); s.push("Huxz"); s.push("George"); print(s.iterator()); LinkedList l = new LinkedList(); l.addFirst("Liucy"); l.addFirst("Huxz"); l.addFirst("George"); print(l.iterator()); } public static void print(Itr it) { while (it.hasNext()) { System.out.println(it.next()); } } } interface Itr { boolean hasNext(); Object next(); } class Stack { Object[] os = new Object[10]; int index = 0; private void expand() { Object[] os2 = new Object[os.length * 2]; System.arraycopy(os, 0, os2, 0, os.length); os = os2; } public void push(Object o) { if (index == os.length) expand(); os[index] = o; index++; } public Object pop() { index--; Object o = os[index]; os[index] = null; return o; } private class StackItr implements Itr { int cursor = 0; public boolean hasNext() { return cursor < index; } public Object next() { return os[cursor++]; } } public Itr iterator() { return new StackItr(); } } class LinkedList { private class Node { Object o; Node next; public Node(Object o) { this.o = o; } public void setNext(Node next) { this.next = next; } public Node getNext() { return this.next; } } Node head; public void addFirst(Object o) { Node n = new Node(o); n.setNext(head); head = n; } public Object removeFirst() { Node n = head; head = head.getNext(); return n.o; } class LinkedListItr implements Itr { Node currentNode = head; public boolean hasNext() { return this.currentNode != null; } public Object next() { Node n = currentNode; currentNode = currentNode.getNext(); return n.o; } } public Itr iterator() { return new LinkedListItr(); } }
===============================================================
2、
抽象聚集角色类,这个角色规定出所有的具体聚集必须实现的接口。迭代子模式要求聚集对象必须有一个工厂方法,也就是createIterator()方法,以向外界提供迭代子对象的实例。
public abstract class Aggregate { /** * 工厂方法,创建相应迭代子对象的接口 */ public abstract Iterator createIterator(); }
具体聚集角色类,实现了抽象聚集角色类所要求的接口,也就是createIterator()方法。此外,还有方法getElement()向外界提供聚集元素,而方法size()向外界提供聚集的大小等。
public class ConcreteAggregate extends Aggregate { private Object[] objArray = null; /** * 构造方法,传入聚合对象的具体内容 */ public ConcreteAggregate(Object[] objArray){ this.objArray = objArray; } @Override public Iterator createIterator() { return new ConcreteIterator(this); } /** * 取值方法:向外界提供聚集元素 */ public Object getElement(int index){ if(index < objArray.length){ return objArray[index]; }else{ return null; } } /** * 取值方法:向外界提供聚集的大小 */ public int size(){ return objArray.length; } }
抽象迭代子角色类
public interface Iterator { /** * 迭代方法:移动到第一个元素 */ public void first(); /** * 迭代方法:移动到下一个元素 */ public void next(); /** * 迭代方法:是否为最后一个元素 */ public boolean isDone(); /** * 迭代方法:返还当前元素 */ public Object currentItem(); }
具体迭代子角色类
public class ConcreteIterator implements Iterator { //持有被迭代的具体的聚合对象 private ConcreteAggregate agg; //内部索引,记录当前迭代到的索引位置 private int index = 0; //记录当前聚集对象的大小 private int size = 0; public ConcreteIterator(ConcreteAggregate agg){ this.agg = agg; this.size = agg.size(); index = 0; } /** * 迭代方法:返还当前元素 */ @Override public Object currentItem() { return agg.getElement(index); } /** * 迭代方法:移动到第一个元素 */ @Override public void first() { index = 0; } /** * 迭代方法:是否为最后一个元素 */ @Override public boolean isDone() { return (index >= size); } /** * 迭代方法:移动到下一个元素 */ @Override public void next() { if(index < size) { index ++; } } }
客户端类
public class Client { public void operation(){ Object[] objArray = {"One","Two","Three","Four","Five","Six"}; //创建聚合对象 Aggregate agg = new ConcreteAggregate(objArray); //循环输出聚合对象中的值 Iterator it = agg.createIterator(); while(!it.isDone()){ System.out.println(it.currentItem()); it.next(); } } public static void main(String[] args) { Client client = new Client(); client.operation(); }
相关推荐
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
迭代器模式是软件设计模式中的一种行为模式,其主要目的是为了在不暴露聚合对象内部结构的情况下,提供一种顺序访问聚合对象中各个元素的方式。在Java中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等...
迭代模式是一种行为设计模式,它允许我们通过统一的接口遍历集合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛使用,尤其是在集合类库中,如ArrayList、LinkedList等。下面我们...
迭代器模式是软件设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java编程语言中,迭代器模式的应用尤为广泛,尤其是在处理集合类如ArrayList、LinkedList等时。这...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代器(Iterator)是软件设计模式中的一个重要概念,它提供了一种方法来顺序访问聚合对象的元素,而不暴露其底层的表示。迭代器允许你遍历一个集合,并按需访问集合中的下一个元素,而无需知道集合的具体实现。迭代...
3. **行为型模式**:这类模式关注对象之间的责任分配。 - 责任链模式(Chain of Responsibility):避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 - 命令模式(Command):将请求封装为...
在这个话题中,我们将深入探讨如何利用组合模式(Composite Pattern)和迭代模式(Iterator Pattern)来构建和遍历树结构。 **组合模式**是面向对象设计模式的一种,它允许我们处理部分和整体的关系。在树形结构中...
在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...
- **迭代器模式(Iterator)**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - **中介者模式(Mediator)**:用一个中介对象来封装一系列的对象交互。 - **备忘录模式(Memento)**:在不破坏...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
设计模式根据其目的和范围,通常被分为三大类:创建型模式、结构型模式和行为型模式。 创建型模式主要用于对象的创建,使对象的创建和使用分离,从而降低系统的耦合性。结构型模式关注对象和类的组合,以便形成更大...
3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。 - 命令模式(Command):将一个请求封装为一个对象...
3. **行为型模式**(Behavioral Patterns) 每种模式都有详细的介绍,包括模式的目的、应用场景、实现方式及其优缺点等。 #### 五、设计模式解决设计问题的方法 **如何通过设计模式解决问题:** 设计模式能够帮助...
3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility):将请求封装为一个对象,使得可以用不同的对象来处理同一个请求。 - 命令模式(Command):将请求封装为一个对象,以便使用不同...