Java设计模式

    xiaoxiao2022-06-28  163

    引用百科

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

    适用性

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

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

    具体实现:

    相关代码

    1、抽象聚集类

    //抽象聚集角色类 public abstract class Aggregate {     /**      * 工厂方法,创建相应迭代子对象的接口      */     public abstract Iterator createIterator(); }

    2、具体抽象聚集类实现

    //具体聚集角色类 public class RealAggregate extends Aggregate {       private Object[] objArray = null;       /**      * 构造方法,传入聚合对象的具体内容      */     public RealAggregate(Object[] objArray) {         this.objArray = objArray;     }       @Override     public Iterator createIterator() {         return new RealIterator(this);     }       /**      * 取值方法:向外界提供聚集元素      */     public Object getElement(int index) {           if (index < objArray.length) {             return objArray[index];         } else {             return null;         }     }     /**      * 取值方法:向外界提供聚集的大小      */     public int size() {         return objArray.length;     } }

    3、迭代接口

    //抽象迭代接口 public interface Iterator {     /**      * 迭代方法:移动到第一个元素      */     public void first();       /**      * 迭代方法:移动到下一个元素      */     public void next();       /**      * 迭代方法:是否为最后一个元素      */     public boolean isDone();       /**      * 迭代方法:返还当前元素      */     public Object currentItem(); }

    4、具体迭代实现类

    //具体迭代子角色类 public class RealIterator implements Iterator {       // 持有被迭代的具体的聚合对象     private RealAggregate agg;     // 内部索引,记录当前迭代到的索引位置     private int index = 0;     // 记录当前聚集对象的大小     private int size = 0;       public RealIterator(RealAggregate 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++;         }     } }

    5、客户端Client测试

    public class Client {       public static void operation() {         Object[] objArray = { "One", "Two", "Three", "Four", "Five", "Six" };         // 创建聚合对象         Aggregate aggregate = new RealAggregate(objArray);         // 循环输出聚合对象中的值         Iterator it = aggregate.createIterator();         while (!it.isDone()) {             System.out.println(it.currentItem());             it.next();         }     }       public static void main(String[] args) {         operation();     } }

    通过以上简单代码实现了迭代模式,同时循环迭代输出了数组中的内容!

    迭代模式效果:

    它支持以不同的方式遍历一个聚合。 迭代器简化了聚合的接口。 在同一个聚合上可以有多个遍历。

    迭代子模式的优点 1)迭代子模式简化了聚集的接口。迭代子具备了一个遍历接口,这样聚集的接口就不必具备遍历接口。

    2)每一个聚集对象都可以有一个或多个迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。因此,一个聚集对象可以同时有几个迭代在进行之中。

    3)由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集角色变化。


    最新回复(0)