`

3. 行为型模式 (4) 迭代子模式

阅读更多
3. 行为型模式 (4) 迭代器模式

迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

优点:
1. 它支持以不同的方式遍历一个聚合对象。
2. 迭代器简化了聚合类。
3. 在同一个聚合上可以有多个遍历。
4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点:
1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。


1. 迭代器模式

package com.andrew.pattern0304.iterator.model01;
public interface Iterator {
    public boolean hasNext();
    public Object next();
}

package com.andrew.pattern0304.iterator.model01;
public interface Container {
    public Iterator getIterator();
}


package com.andrew.pattern0304.iterator.model01;
public class NameRepository implements Container {
    public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }
    private class NameIterator implements Iterator {
        int index;
        @Override
        public boolean hasNext() {
            if (index < names.length) {
                return true;
            }
            return false;
        }
        @Override
        public Object next() {
            if (this.hasNext()) {
                return names[index++];
            }
            return null;
        }
    }
}


package com.andrew.pattern0304.iterator.model01;
/**
 * 1. 迭代器模式
 * 
 * @author andrew
 * @date 2018/08/01
 */
public class Client {
    public static void main(String[] args) {
        NameRepository namesRepository = new NameRepository();
        for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {
            String name = (String)iter.next();
            System.out.println("Name : " + name);
        }
    }
}
运行结果:
Name : Robert
Name : John
Name : Julie
Name : Lora


角色:
1. 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
2. 具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
3. 聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
4. 具体聚集(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
5. 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。


2. 迭代子模式

package com.andrew.pattern0304.iterator.model02;
public abstract class Aggregate {
    public abstract Iterator createIterator();
}


package com.andrew.pattern0304.iterator.model02;
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;
    }
}


package com.andrew.pattern0304.iterator.model02;
public interface Iterator {
    public void first();
    public void next();
    public boolean isDone();
    public Object currentItem();
}


package com.andrew.pattern0304.iterator.model02;
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 void first() {
        index = 0;
    }
    @Override
    public void next() {
        if (index < size) {
            index ++;
        }
    }
    @Override
    public boolean isDone() {
        return (index >= size);
    }
    @Override
    public Object currentItem() {
        return agg.getElement(index);
    }
}


package com.andrew.pattern0304.iterator.model02;
/**
 * 2. 迭代器模式
 * 
 * @author andrew
 * @date 2018/08/01
 */
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();
    }
}
运行结果:
One
Two
Three
Four
Five
Six


3. 迭代子模式
package com.andrew.pattern0304.iterator.model03;
public abstract class Aggregate {
    public abstract Iterator createIterator();
}


package com.andrew.pattern0304.iterator.model03;
public interface Iterator {
    public void first();
    public void next();
    public boolean isDone();
    public Object currentItem();
}


package com.andrew.pattern0304.iterator.model03;
public class ConcreteAggregate extends Aggregate {
    private Object[] objArray = null;
    public ConcreteAggregate(Object[] objArray) {
        this.objArray = objArray;
    }
    @Override
    public Iterator createIterator() {
        return new ConcreteIterator();
    }
    private class ConcreteIterator implements Iterator {
        private int index = 0;
        private int size = 0;
        public ConcreteIterator() {
            this.size = objArray.length;
            index = 0;
        }
        @Override
        public void first() {
            index = 0;
        }
        @Override
        public void next() {
            if (index < size) {
                index ++;
            }
        }
        @Override
        public boolean isDone() {
            return (index >= size);
        }
        @Override
        public Object currentItem() {
            return objArray[index];
        }
    }
}


package com.andrew.pattern0304.iterator.model03;
/**
 * 3. 迭代器模式
 * 
 * @author andrew
 * @date 2018/08/01
 */
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();
    }
}
运行结果:
One
Two
Three
Four
Five
Six
分享到:
评论

相关推荐

    c++设计模式-行为型模式-迭代器模式

    迭代器模式是软件设计模式中的一种行为模式,它在C++以及其他面向对象编程语言中有着广泛的应用。这个模式的主要目标是允许用户以一种统一的方式遍历聚合对象中的元素,而无需暴露聚合对象的内部结构。这增加了代码...

    IteratorPattern 迭代设计模式

    迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    Iterator Pattern(迭代模式)

    迭代模式是一种行为设计模式,它允许我们通过统一的接口遍历集合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛使用,尤其是在集合类库中,如ArrayList、LinkedList等。下面我们...

    子空间迭代法code.zip_子空间_子空间迭代_振动_振动 频率_迭代法振型

    4. **迭代**:通过求解子空间内的特征值问题来逼近固有频率和对应的振型。每次迭代通常会通过增广子空间和更新特征值解来提高精度。 5. **柱状规范化**:"column_normalization.m"可能是用于对振型进行归一化的函数...

    新版设计模式手册 通俗的例子讲述设计的方法 1创建型模式 2结构型模式 3 行为模式 详细的设计说明

    这个“新版设计模式手册”深入浅出地介绍了设计模式的三大类:创建型模式、结构型模式和行为模式,为开发者提供了一套详细的设计说明。 一、创建型模式 创建型模式主要关注对象的创建过程,它们的目标是使得对象的...

    06.设计模式.rar

    总体来说设计模式分为三大类:创建型模式,共五种:...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    32设计模式.doc

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    JAVA设计模式(创建模式 结构模式 行为模式)

    本资源主要涵盖了创建模式、结构模式和行为模式三大类,每种模式都是面向对象设计的核心部分。 创建模式主要用于解决对象的创建问题,使得对象的创建过程更加灵活,易于扩展。其中: 1. 工厂模式(Factory Pattern...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    java 23种设计模式及具体例子

    * 迭代子模式:迭代子模式是一种行为型模式,它可以将对象之间的关系建立在迭代子的基础上,以便于更好地实现对象之间的关系。 * 责任链模式:责任链模式是一种行为型模式,它可以将对象之间的关系建立在责任链的...

    设计模式-C++

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    23种设计模式.pdf

    4. 迭代子模式:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 5. 责任链模式:将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求。 6. 命令模式:将请求封装为一个对象,以便使用不同...

    设计模式-创建型模式、结构型模式和行为型模式

    按照不同的功能特性,设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 #### 二、创建型模式 创建型模式主要用于解决对象创建的过程,旨在简化对象创建的复杂度,同时保持对象创建的灵活性。主要...

    23个设计模式之一的迭代器模式-极客学院-java-课件代码,

    迭代器模式是软件设计模式中的行为模式之一,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在Java编程语言中,迭代器模式的应用尤为广泛,尤其是在处理集合类如ArrayList、LinkedList等时。这...

    23种设计模式项目实例

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    23种设计模式 -设计模式图解.7z

    23种设计模式的特点定义、优缺点、使用场景,源码中...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    16. 迭代器模式:迭代器模式是一种行为型模式,它提供了一种顺序访问聚合对象中元素的方法,同时又不暴露其底层表示。 17. 责任链模式:责任链模式是一种行为型模式,它允许将请求沿着处理者链进行传递,直到被某个...

    Java设计模式之禅

    3. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 4. 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生...

    java常用23中设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

Global site tag (gtag.js) - Google Analytics