Java设计模式(二)——迭代模式

迭代模式的基本定义:对于一组对象集合(数组、堆栈、列表或散列),用户无需关心它的底层实现而能够通过调用统一接口遍历当中的所有元素。由于jdk已经对常见的迭代模式实现了封装,本文直接提供Collection和Iterator两个接口的模拟。

定义Iterator接口

/*
 * 设计迭代接口
 */
public interface Iterator<E> {
    // 测试是否有下一个元素
    boolean hasNext();
    // 返回下一个元素
    E next();
}

Iterator.java

定义Collection接口

/*
 * 设计一个集合对象
 */
public interface Collection<E> {
    void add(E e);
    E get(int index);
    int size();
    // 要求实现类根据自身的特点实现迭代方法
    Iterator<E> iterator();
}

Collection.java

对于任何实现了接口的集合都能很方便的查找或遍历其中的元素。

创建使用数组方式存放元素集合的类:ArrayList

/*
 * 模拟jdk中ArrayList的实现
 */
public class ArrayList<E> implements Collection<E>, Iterator<E> {
    // 迭代下标
    private int iteratorIndex = 0;
    // 初始化的数组大小
    private Object[] objects = new Object[10];
    // 数组下标
    private int index = 0;

    @Override
    public void add(E e) {
        if (index == objects.length) {
            // 数组的增长的步长为10
            Object[] newObjects = new Object[objects.length + 10];
            System.arraycopy(objects, 0, newObjects, 0, objects.length);
            objects = newObjects;
        }
        objects[index] = e;
        index++;
    }

    // 通过ArrayList读取元素是一次性的,开销较小
    @Override
    public E get(int index) {
        if (index < this.index) {
            return (E) objects[index];
        } else {
            return null;
        }
    }

    @Override
    public int size() {
        return index;
    }

    @Override
    public Iterator<E> iterator() {
        return this;
    }

    @Override
    public boolean hasNext() {
        if (iteratorIndex < index) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public E next() {
        if (iteratorIndex < index) {
            E e = get(iteratorIndex);
            iteratorIndex++;
            return e;
        } else {
            return null;
        }
    }
}

ArrayList.java

创建使用链表方式存放元素集合的类:LinkedList

package iterator.jdk;
/*
 * 模拟jdk中LinkedList的实现
 */
public class LinkedList<E> implements Collection<E>, Iterator<E> {
    // 迭代下标
    private int iteratorIndex = 0;
    // 链表长度,随元素的数量逐步递增
    private int len = 0;

    private Node<E> headNode;
    private Node<E> tailNode;
    private Node<E> point;

    // 内部类实现链表对象的存储
    private class Node<E> {
        E e;
        Node<E> next;

        Node(E e, Node<E> next) {
            this.e = e;
            this.next = next;
        }

        public Object get() {
            return e;
        }

        public Node<E> getNext() {
            return next;
        }

        public void setNext(Node<E> next) {
            this.next = next;
        }
    }

    @Override
    public void add(E e) {
        // len==0既是把头元素放入也是将链表初始化
        if (len == 0) {
            headNode = new Node<E>(e, null);
            tailNode = headNode;
            point = headNode;
            len++;
        } else {
            Node<E> node = new Node<E>(e, null);
            tailNode.setNext(node);
            tailNode = node;
            len++;
        }
    }

    // 通过LinkedList每次读取元素都是一次迭代的过程,开销较大
    @Override
    public E get(int index) {
        if (index == 0) {
            return (E) headNode.get();
        } else if (index > 0 && index < this.len) {
            Node<E> node = headNode;
            for (int i = 1; i <= index; i++) {
                node = node.getNext();
            }
            return (E) node.get();
        } else {
            return null;
        }
    }

    @Override
    public int size() {
        return len;
    }

    @Override
    public Iterator<E> iterator() {
        return this;
    }

    @Override
    public boolean hasNext() {
        if (iteratorIndex < len) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public E next() {
        if (iteratorIndex < len) {
            E e = (E) point.get();
            point = point.getNext();
            iteratorIndex++;
            return e;
        } else {
            return null;
        }
    }

}

LinkedList.java

附:JDK容器分类

时间: 2024-10-20 11:17:41

Java设计模式(二)——迭代模式的相关文章

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

java设计模式--行为型模式--迭代模式

1 迭代器模式 2 概述 3 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 4 5 6 适用性 7 1.访问一个聚合对象的内容而无需暴露它的内部表示. 8 9 2.支持对聚合对象的多种遍历. 10 11 3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代). 12 13 14 参与者 15 1.Iterator 16 迭代器定义访问和遍历元素的接口. 17 18 2.ConcreteIterator 19 具体迭代器实现迭代器接口.

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

浅析JAVA设计模式之工厂模式(三)

在阅读本文之前,请先阅读(一)和(二)中的简单工厂模式和工厂方法模式. 1抽象工厂模式简介 抽象工厂 (Abstract Factroy) 模式:工具箱模式(kit).抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,如下图. 图1.1 上图左边有一个工厂类的等级结构,右边有两个不同的产品等级结构,分别是产品A的等级结构和产品B的等级结构,工厂1和工厂2分别负责不同一个产品等级,同一个产品族的产品的生产.又例如下图: 图1.2 上图表示的是Button和Text两个不同产品的等级

JAVA设计模式之 状态模式【State Pattern】

一.概述 当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化.状态模式是一种对象行为型模式. 二.适用场景 用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题.简单说就是处理对象的多种状态及其相互转换. 三.UML类图 四.参与者 1>.AbstractState(抽象状态类): 在抽象状态类中定义申明了不同状态下的行为抽象方法,而由子类

浅析JAVA设计模式之工厂模式(一)

1 工厂模式简介 工厂模式的定义:简单地说,用来实例化对象,代替new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式可以动态决定将哪一个类实例化,不用先知道每次要实例化哪一个类. 工厂模式可以分一下三种形态: 简单工厂 (Simple Factory)模式:又称静态工厂模式(StaticFactory). 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory). 抽象工厂 (Abstract Factroy)模式:又称工具箱模式

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

Java设计模式之工厂模式(Factory模式)介绍(转载)

原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工厂.Java工厂模式举例等内容,需要的朋友可以参考下 工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经