设计模式-17-迭代器

简介:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

目的:

总结:使用Iterator避免二次迭代

组成:

1,举例

package com.design.q.iterator.standard;

import java.util.Iterator;

@SuppressWarnings("unchecked")
public class ArrayList<E> implements Iterable<E>{

    private E[] array = (E[]) new Object[10];  //集合
    private static final int INCREMENT = 10;   //集合扩展大小
    private int size = 0;                      //集合实时大小

    /**
     * 集合元素添加
     * @param e
     */
    public void add(E e){
        if(size < array.length){
            array[size ++] = e;
        }else{
            //集合大小不足时进行扩容
            E[] copy = (E[]) new Object[array.length + INCREMENT];
            System.arraycopy(array, 0, copy, 0, size);
            copy[size ++] = e;
            array = copy;
        }
    }

    /**
     * 集合数组化
     * @return
     */
    public Object[] toArray(){
        Object[] copy = new Object[size];
        System.arraycopy(array, 0, copy, 0, size);
        return copy;
    }

    /**
     * 返回集合大小
     * @return
     */
    public int size(){
        return size;
    }

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

    private class Ite implements Iterator<E>{

        int index = 0;

        @Override
        public boolean hasNext() {
            return index != size();
        }

        @Override
        public E next() {
            return array[index ++];
        }

        public void remove(){

        }

    }

}

LinkedList

package com.design.q.iterator.standard;

import java.util.Iterator;

public class LinkedList<E> implements Iterable<E>{

    private Entry<E> header = new Entry<E>(null, null, null);
    private int size;

    public LinkedList() {
        header.next = header.previous = header;
    }

    /**
     * 集合新增元素
     * @param e
     */
    public void add(E e){
        Entry<E> newEntry = new Entry<E>(e, header, header.next);
        newEntry.previous.next = newEntry;
        newEntry.next.previous = newEntry;
        size ++;
    }

    /**
     * 集合数组化
     * @return
     */
    public Object[] toArray(){
        Object[] result = new Object[size];
        int i = size - 1;
        for(Entry<E> e = header.next; e != header; e = e.next){
            result[i --] = e.value;
        }
        return result;
    }

    /**
     * 返回集合大小
     * @return
     */
    public int size(){
        return size;
    }

    private static class Entry<E>{
        E value;
        Entry<E> previous;
        Entry<E> next;
        public Entry(E value, Entry<E> previous, Entry<E> next){
            super();
            this.value = value;
            this.previous = previous;
            this.next = next;
        }
    }

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

    private class Ite implements Iterator<E>{

        Entry<E> index = header;

        @Override
        public boolean hasNext() {
            return index.previous != header;
        }

        @Override
        public E next() {
            E e = index.previous.value;
            index = index.previous;
            return e;
        }

        @Override
        public void remove() {
            // TODO Auto-generated method stub

        }

    }
}

HashSet

package com.design.q.iterator.standard;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashSet<E> implements Iterable<E>{

    private static final Object NULL = new Object();
    private Map<E, Object> map = new HashMap<>();

    /**
     * 集合元素新增
     * @param e
     */
    public void add(E e){
        map.put(e, NULL);
    }

    /**
     * 集合数组化
     * @return
     */
    public Object[] toArray(){
        return map.keySet().toArray();
    }

    /**
     * 集合大小
     * @return
     */
    public int size(){
        return map.size();
    }

    @Override
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }
}

2,Main

package com.design.q.iterator.standard;

import java.util.Iterator;

/**
 * 17-迭代器模式
 *
 * 使用Iterator避免二次迭代
 */
public class MainTest {

    public static void main(String[] args) {

        /**
         * ArrayList迭代
         */
        ArrayList<Integer> arrayList = new ArrayList<>();
        for(int i = 0; i < 10; i++){
            arrayList.add(i);
        }
        System.out.println("ArrayList 大小=" + arrayList.size());
        Iterator<Integer> arrayListIterator = arrayList.iterator();
        while(arrayListIterator.hasNext()){
            System.out.print(arrayListIterator.next() + " ");
        }
//        for(Integer i : arrayList){
//            System.out.print(i + " ");
//        }

        /**
         * LinkedList迭代
         */
        LinkedList<Integer> linkedList = new LinkedList<>();
        for(int i = 0; i < 10; i ++){
            linkedList.add(i);
        }
        System.out.println("\nLinkedList 大小=" + linkedList.size());
        Iterator<Integer> linkedListIterator = linkedList.iterator();
        while(linkedListIterator.hasNext()){
            System.out.print(linkedListIterator.next() + " ");
        }
//        for(Integer i : linkedList){
//            System.out.print(i + " ");
//        }

        /**
         * HashSet迭代
         */
        HashSet<Integer> hashSet = new HashSet<>();
        for(int i = 0; i < 10; i ++){
            hashSet.add(i);
        }
        System.out.println("\nHashSet 大小=" + hashSet.size());
        Iterator<Integer> hashSetIterator = hashSet.iterator();
        while(hashSetIterator.hasNext()){
            System.out.print(hashSetIterator.next() + " ");
        }
//        for(Integer i : hashSet){
//            System.out.print(i + " ");
//        }
    }
}

3,Result

ArrayList 大小=10
0 1 2 3 4 5 6 7 8 9
LinkedList 大小=10
0 1 2 3 4 5 6 7 8 9
HashSet 大小=10
0 1 2 3 4 5 6 7 8 9 
时间: 2024-10-14 14:58:53

设计模式-17-迭代器的相关文章

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

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato

设计模式 3 —— 迭代器和组合模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式 概要 设计模式 3 -- 迭代器和组合模式

设计模式(9)--迭代器与组合模式

(1)散列表(hashtable)         共迭代器获取 hashtable.values().iterator();  因为每一笔数据都是由键值对组成. (2)迭代器是用来遍历集合的. Java5后集合都出了自己的遍历方式 如增加for循环.           遍历 也称 游走... (3)数组:Array 长定固定   集合:ArrayList 可扩展,取数据不需要转型 (4)Java中有自己的迭代器接口.在java.util.Iterator  . (5)集合:collectio

设计模式之迭代器模式(Iterator)

1.定义 迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节. 基本上没有人会单独写一个迭代器,除非是产品性质的开发. 2.通用类图 Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素:next()访问下一个元素:isDone()是否已经访问到底部(Java 叫做hasNext()方法). ConcreteIterator具体迭代器:具体迭代器角色要实现迭代器接口,完成容器元素的遍历. Ag

C#设计模式(17)——观察者模式(Observer Pattern)

原文:C#设计模式(17)--观察者模式(Observer Pattern) 一.引言 在现实生活中,处处可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用.在这一章将分享我对观察者模式的理解,废话不多说了,直接进入今天的主题. 二. 观察者模式的介绍 2.1 观察者模式的定义 从生活中的例子可以看出,只要对订阅号进行关注的客户端,如果订阅号有什么更新,就会直接推送给订阅了的用户.从中,我们就可以得出观察者模式的定义. 观察者模式定义了一种一对多的依赖

2018.4.30 设计模式之迭代器模式

设计模式之迭代器模式 1.定义/概念 迭代器模式是Java和.Net编程环境中非常常用的设计模式.这种设计模式用于顺序访问集合对象的元素要知道集合对象的底层表示.迭代器模式属于行为型模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.角色和定义 ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

设计模式17:Iterator 迭代器模式(行为型模式)

Iterator 迭代器模式(行为型模式) 动机(Motivation) 在软件构建过程中,集合对象内部结构常常变化各异.但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码可以透明地访问其包含的元素:同时这种“透明变量”也为“同一种算法在多种集合对象上进行操作”提供了可能. 使用面向对象技术使这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式. 意图(Intent)提供一种方法顺序访问一个聚合对象中各个元素 , 而又不需暴露该对象的内部表示.——

设计模式之迭代器模式(Iterator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

大话设计模式_迭代器模式(Java代码)

迭代器模式:提供一个方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示 简单描述:提供一个单独的接口遍历聚集类对象中的成员,以实现聚集对象的隐藏和内部数据供外部访问 大话设计模式中的截图: 我觉得以上面的图示进行编码会暴露ConcreteAggregate中的内部信息(ConcreteIerator可以访问聚集类中的成员,那表示其他类也可以和ConcreteIerator一样进行相同的访问),所以我以另外一种形式实现迭代器(即内部类的方式,和Java中的ArrayList类似) 代码