设计模式 之 迭代子模式

设计模式 之 迭代子模式

迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 --阎宏博士的《JAVA与模式》


例:集合的遍历

第一版:实现数组集合和链表集合

集合接口

public interface MyCollection {
    void add(Object o);
    int size();
}

数组集合

public class MyArrayList implements MyCollection {
    private Object[] objects = new Object[10]; // 初始容器大小
    private int position = 0; // 游标(下一个插入元素的位置)
    @Override
    public void add(Object o) {
        if(position == objects.length) { // 如果容器已满,扩充容器
            Object[] newObjects = new Object[objects.length * 2];
            System.arraycopy(objects, 0, newObjects, 0, objects.length);
            objects = newObjects;
        }
        objects[position] = o;
        position ++;
    }
    @Override
    public int size() {
        return position;
    }
}

链表集合

public class MyLinkedList implements MyCollection {
    private Node head = null;
    private Node tail = null;
    private int size = 0;
    @Override
    public void add(Object o) {
        Node node = new Node(o, null);
        if(head == null) { // 第一个
            head = node;
            tail = node;
        } else {
            tail.setNext(node);
            tail = node;
        }
        size ++;
    }
    @Override
    public int size() {
        return size;
    }

    class Node {
        private Object data;
        private Node next;

        public Node(Object data, Node next) {
            this.data = data;
            this.next = next;
        }
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
    }
}

OK,我们发现MyArrayList和MyLinkedList虽都实现了MyCollection接口,但具体实现方法不同,导致遍历方式也不同,要想统一遍历方式只能用一种抽象类/接口的方式

第二版:统一遍历方法

增加统一的遍历接口

public interface MyIterator {
    Object next();
    boolean hasNext();
}

让所有集合类都要实现该接口(只要实现了MyCollection接口的集合类我们就可以调用其iterator()方法遍历其元素)

public interface MyCollection {
    void add(Object o);
    int size();
    MyIterator iterator();
}

此时再遍历集合就很简单了

while(iterator.hasNex()) {
    Object data = iterator.next();
}

下面开始实现MyIterator - 数组集合

public class MyArrayList implements MyCollection {
    private Object[] objects = new Object[10]; // 初始容器大小
    private int position = 0; // 游标(下一个插入元素的位置)
    @Override
    public void add(Object o) {
        if(position == objects.length) { // 如果容器已满,扩充容器
            Object[] newObjects = new Object[objects.length * 2];
            System.arraycopy(objects, 0, newObjects, 0, objects.length);
            objects = newObjects;
        }
        objects[position] = o;
        position ++;
    }
    @Override
    public int size() {
        return position;
    }
    @Override
    public MyIterator iterator() {
        return new MyIterator() {
            int index = 0;
            @Override
            public Object next() {
                return objects[index ++];
            }

            @Override
            public boolean hasNext() {
//                if(index < objects.length) // 低级错误
                if(index < position)
                    return true;
                return false;
            }
        };
    }
}

链表集合

public class MyLinkedList implements MyCollection {
    private Node head = null;
    private Node tail = null;
    private int size = 0;
    @Override
    public void add(Object o) {
        Node node = new Node(o, null);
        if(head == null) { // 第一个
            head = node;
            tail = node;
        } else {
            tail.setNext(node);
            tail = node;
        }
        size ++;
    }
    @Override
    public int size() {
        return size;
    }

    class Node {
        private Object data;
        private Node next;

        public Node(Object data, Node next) {
            this.data = data;
            this.next = next;
        }
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
    }

    @Override
    public MyIterator iterator() {
        return new MyIterator() {
            Node currNode = head;
            @Override
            public Object next() {
                Object o = currNode.getData();
                currNode = currNode.getNext();
                return o;
            }
            @Override
            public boolean hasNext() {
                return currNode != null;
            }
        };
    }
}

测试

public class Test {
    public static void main(String[] args) {
        MyCollection al = new MyArrayList();
        MyCollection ll = new MyLinkedList();
        for(int i=0; i<15; i++) {
            al.add(i);
            ll.add(i);
        }
        MyIterator iterator = ll.iterator(); // = al.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
    }
}

Ok,以上就是山寨乞丐版JDK ArrayList 和 LinkedList

时间: 2024-10-27 12:40:32

设计模式 之 迭代子模式的相关文章

Java设计模式之迭代子模式

本文继续介绍23种设计模式系列之观察者模式. 定义 在软件构建过程中,集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素:同时这种"透明遍历"也为同一种算法在多种集合对象上进行操作提供了可能. 使用面向对象技术将这种遍历机制抽象为"迭代器对象"为"应对变化中的集合对象"提供了一种优雅的方式. 迭代子(Iterator)模式又叫游标(Cursor)模式,是对象的行为模式.迭

[设计模式]迭代子模式 Iterator

迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java语言的聚集(Collection)框架中,广泛使用迭代子模式来便利聚集的元素. 聚集与Java聚集 多个对象聚集在一起形成的总体称之为聚集(Aggregate),聚集对象是能够包容一组对象的容器对象.数组就是最基本的聚集,也是其他Java聚集对象的设计基础. Java Collection对象是实现

java设计模式----迭代子模式

顺序访问聚集中的对象,主要用于集合中.一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问. 迭代子模式为遍历集合提供了统一的接口方法.从而使得客户端不需要知道聚集的内部结构就能就能对聚集进行遍历等操作.Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构. 例如,如果没有使用Iterator,遍历一个数组的方法是使用索引: for(int i=0; i<array.size(); i++) {

迭代子模式(Iterator)

迭代子(Iterator)模式又叫游标模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式涉及到以下几个角色: 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口. 具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置. 聚集(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口. 具体聚集(ConcreteAggregate)角色:实现了

《JAVA与模式》之迭代子模式

迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation). 聚集和JAVA聚集 多个对象聚在一起形成的总体称之为聚集(Aggregate),聚集对象是能够包容一组对象的容器对象.聚集依赖于聚集结构的抽象化,具有复杂化和多样性.数组就是最基本的聚集,也是其他的JAVA聚集对象的设计基础. JAVA聚集对象是实现了共同的java.util.Collection接口的对象,是JAVA语言

IteratorPattern(迭代子模式)

/** * 迭代子模式 * @author TMAC-J * 聚合:某一类对象的集合 * 迭代:行为方式,用来处理聚合 * 是一种行为模式,用于将聚合本身和操作聚合的行为分离 * Java中的COLLECT就是一种聚合,Iterator类是一种迭代 * 好处:分开了行为和本身,便于行为的扩展和本身的维护,符合开闭原则 * 分为白盒(宽接口)和黑盒(窄接口) * 白盒:白盒提供了一些可以访问聚合内部的方法,如getSize,add,remove等等 * 黑盒:不提供或者提供很少外部访问的方法,对外

迭代子模式

概述: Java对迭代子模式的支持来自于Java聚集的需要,一个聚集需要向外界提供遍历聚集元素的方法.提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构 迭代器模式:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构.又叫做游标(Cursor)模式 . 适用性 迭代器模式可用来: ? 访问一个聚合对象的内容而无需暴露它的内部表示. ? 需要为聚合对象提供多种遍历方式. ? 为遍历不同的聚合结构提供一个统一的接

设计模式(1) -- 迭代模式

Iterator(迭代器)接口在Java中可以用来嵌入对象当中来实现具体应用,在设计模式中强调的是"低耦合","高复用","不要用具体代码来编程,要优先使用接口和抽象类来编程." 这个实例当中不管BookShelf如何变化,只要BookShelf类可以返回重写了Iterator方法(hasNext,Next)的BookShelfIterator类,无论改成数组还是集合测设代码都可以正常运转,这便是组件化,当一个组件发生改变时,可以不用修改其他组件

【设计模式】—— 迭代模式Iterator

前言:[模式总览]——————————by xingoo 模式意图 提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示. 应用场景 1 访问一个聚合的对象,而不需要暴露对象的内部表示 2 支持对聚合对象的多种遍历 3 对遍历不同的对象,提供统一的接口. 模式结构 Iterator 定义访问的接口 /** * 抽象的迭代,有判断结束和下一个,获取当前元素等函数 * @author xingoo * */ interface Iterator{ void first(); voi