美文网首页
第5章 -行为型模式-迭代器模式

第5章 -行为型模式-迭代器模式

作者: 一介书生独醉江湖 | 来源:发表于2022-07-12 19:45 被阅读0次
行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、迭代器模式的简介
■ 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节;
■ 迭代器模式(Iterator Pattern)被广泛地应用到 Java 的API中;
  Java的集合(Collection)框架中,就广泛使用迭代器来遍历集合中的元素;
image.png
迭代器模式4个角色:
■ 抽象迭代器(Iterator)角色:
  该角色负责定义访问和遍历元素的接口;
■ 具体迭代器(Concrete Iterator)角色:
  该角色实现Iterator接口,完成容器元素的遍历;
■ 抽象聚集(Aggregate)角色:
  该角色提供创建迭代器角色的接口;
■ 具体聚集(Concrete Aggregate)角色:
  该角色实现抽象聚集接口,创建出容纳迭代器的对象;
/**
 * 抽象迭代器
 */
public interface Iterator {

    Object next();

    boolean hasNext();

}

/**
 * 抽象聚集
 */
public interface Aggregate {

    void add(Object obj);

    Iterator createIterator();
}

/**
 * 具体迭代器
 */
public class ConcreteIterator implements Iterator{

    private ConcreteAggregate agg;

    private int index = 0;

    private int size = 0;

    public ConcreteIterator(ConcreteAggregate agg) {
        this.agg = agg;
        size = agg.size();
        index = 0;
    }

    /**
     * 返回下一个元素
     * @return
     */
    @Override
    public Object next() {
        if(index < size){
            return agg.getElement(index ++);
        }else{
            return null;
        }
    }

    /**
     * 是否有下一个元素,即还没有遍历结束
     * @return
     */
    @Override
    public boolean hasNext() {
        return index < size;
    }

}
/**
 * 具体聚集
 */
public class ConcreteAggregate implements Aggregate{

    private Vector vector = new Vector();

    @Override
    public void add(Object obj) {
        this.vector.add(obj);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }

    public Object getElement(int index){
        if(index < vector.size()){
            return vector.get(index);
        }else{
            return null;
        }
    }

    public int size(){
        return vector.size();
    }
}

/**
 * 应用代码
 */
public class Client {

    public static void main(String[] args){
        Aggregate agg = new ConcreteAggregate();
        agg.add("张三");
        agg.add("李四");
        agg.add("王五");

        Iterator iterator = agg.createIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
# 控制台输出:
张三
李四
王五
二、迭代器模式的优缺点
迭代器模式的优点:
  ■ 迭代器模式简化了访问容器元素的操作,具备一个统一的遍历接口;
  ■ 封装遍历算法,使算法独立于聚集角色;
迭代器模式的缺点:
  ■ 迭代器模式给使用者一个序列化的错觉,从而产生错误;
三、迭代器模式的实例
# 使用Java API中迭代器Iterator遍历集合中的元素
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;

/**
 * 迭代器模式的实例
 */
public class IteratorDemo {

    public static void main(String[] args){
        // 定义一个向量集合
        Vector vector = new Vector();
        vector.add("向量1");
        vector.add("向量2");
        vector.add("向量3");
        vector.add("向量4");
        // 定义一个序列
        ArrayList arrayList = new ArrayList();
        arrayList.add("序列1");
        arrayList.add("序列2");
        arrayList.add("序列3");

        // 定义一个栈
        Stack stack = new Stack();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");
        stack.push("E");

        // 遍历各集合
        java.util.Iterator iterator = vector.iterator();
        System.out.println("遍历向量中的元素:");
        show(iterator);
        System.out.println("遍历序列中的元素:");
        show(arrayList.iterator());
        System.out.println("遍历栈中的元素:");
        show(stack.iterator());
    }

    private static void show(Iterator iterator) {
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
# 控制台输出:
遍历向量中的元素:
向量1
向量2
向量3
向量4
遍历序列中的元素:
序列1
序列2
序列3
遍历栈中的元素:
A
B
C
D
E
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)

相关文章

网友评论

      本文标题:第5章 -行为型模式-迭代器模式

      本文链接:https://www.haomeiwen.com/subject/ajhbvrtx.html