`
zhangweieye
  • 浏览: 9770 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式学习笔记(八:迭代器模式)

 
阅读更多

1.1概述

    提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露对象的内部表示。这就是迭代器模式的定义。

    合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中经常会使用诸如链表、散列表等数据结构。链表和散列表等数据结构都是可以存放若干个对象的集合,其区别是按照不同的方式进行存储对象。我们希望无论何种集合,应当允许程序以一种统一的方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表达及存储的。

  例如,一栋楼中居住着张三、李四、王五三个人,分别被安排在不同的房间,张三知道李四的房间,李四知道王五的房间。假如有一个警察,他并不知道他们三个是如何居住的,只想找到他们,那么警察可以用一个next()方法找人,该方法的特点是在找到一个人的同时立刻让这个人说出他知道的下一个人的房间,然后警察再调用next()方法找到下一个人。如果警察调用next()方法首先找到张三,就可以依次找到李四和王五,具体如图一所示:

 

 

图一:警察找人

    迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个称作迭代器的对象。比如,前面所述的楼就是一个集合,其中的人就是集合中的对象,而警察就是一个迭代器。

 

1.2模式的结构

迭代器模式的结构中包括四种角色:

(1)集合(Aggregate):一个接口,规定了具体集合需实现的操作。

(2)具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按照一定的结构存储对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器。

(3)迭代器(Iterator):一个接口,规定了遍历集合的方法,比如next()方法。

(4)具体迭代器(ConcreteIterator):实现迭代器接口的类的实例,具体迭代器在实现迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证next()方法的首次调用即按照集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立刻根据该集合的存储结构得到待遍历的后继对象的引用,并保证依次调用next()方法可以遍历集合。

迭代器模式结构的类图如下图二所示:

 

 

 

图二:迭代器模式类图

 

1.3迭代器模式的优点

(1)用户使用迭代器模式访问集合中的对象,而不需要知道这些对象在集合中是如何表达及存储的。

(2)用户可以同时使用多个迭代器遍历一个集合。

 

1.4适合使用迭代器模式的情景

 1)让用户访问一个集合中对象,但不想暴露对象在集合中的存储结构。

 2)希望对遍历不同的集合提供一个统一的接口。

 

 

1.5迭代器模式的使用

以下通过一个简单的问题讲述迭代器模式中所涉及的各个角色。

用一种集合模拟保险箱,该集合用返回的迭代器模拟点钞机。具体如下:

(1)集合(Aggregate

在这里使用java.util包中的Collection接口作为模式中的集合角色。Java所有的集合都实现了该接口。


2)具体集合(ConcreteAggregate

在这里使用java.util包中的HashSet类的实例作为模式中的具体集合角色。

需要注意的是,在JDK1.5之后,要使用泛型,即使用HashSet<E>类(E是一个泛型)来创建一个集合对象。在使用HashSet<E>创建一个集合时,必须指定E的具体类型,即指定集合中存放的对象的具体类型,例如:

HashSet<String> set = new HashSet<String>();

那么,该集合set只可以存放String对象的引用,比如:

Set.add(“OK”);

向集合set中添加元素,该元素中存放者”OK”对象的引用,但是:

Set.add(new java.awt.Button());就是一个非法操作。

 

(3)迭代器(Iterator

在本问题中,使用的迭代器是java.util包中的Iterator接口,该接口有:

Boolean hashNext()

Object next()

Void remove()

三个方法。迭代器通过next()方法依次返回集合中的对象,通过调用hashNext()方法判断集合中是否还有对象未被next()方法返回,调用remove()方法从集合中删除最近一次调用next()方法返回的对象。

 

(4)具体迭代器

HashSet创建的集合可以使用iterator()方法返回一个实现Iterator接口类的实例,即一个具体迭代器。

 

5)具体使用

 通过EightApllication类来具体实现上述相关类和接口,来实现适配器模式的运用,其代码如下:

复制代码
package com.liuzhen.eight_iterator;

import java.util.*;

public class EightApplication {
    public static void main(String args[]){
        int n = 20;
        int sum = 0;
        Collection<Money> set =  new HashSet<Money>();   //集合对象
        for(int i = 0;i <= n;i++){
            if(i == n/2 || i == n/5 || i == n/6)
                set.add(new Money(100,false));
            else
                set.add(new Money(100,true));
        }
        Iterator<Money> iterator = set.iterator();   //迭代器
        System.out.println("保险箱共有"+set.size()+"张人民币");
        int k = 0;
        while(iterator.hasNext()){
            Money money = iterator.next();
            k++;
            if(money.getIsTrue() == false){
               System.out.println("第"+k+"张是假币,被销毁");
               iterator.remove();
               k++;
            }
        }
        System.out.println("保险箱现有真人民币"+set.size()+"张,总价值是:");
        iterator = set.iterator();
        while(iterator.hasNext()){
            Money money = iterator.next();
            sum = sum+money.getValue();
        }
        System.out.println(sum+"元");
    }
}
复制代码

相关类Money.java代码如下:

复制代码
package com.liuzhen.eight_iterator;

public class Money {
    int value;
    private boolean isTrue;
    Money(int value , boolean isTrue){
        this.value = value;
        this.isTrue = isTrue;
    }
    public boolean getIsTrue(){
        return isTrue;
    }
    public int getValue(){
        return value;
    }
}
复制代码

 

运行结果:

复制代码
保险箱共有21张人民币
第4张是假币,被销毁
第10张是假币,被销毁
第18张是假币,被销毁
保险箱现有真人民币18张,总价值是:
1800元
分享到:
评论

相关推荐

    C#学习笔记整理-迭代器模式介绍

    迭代器模式是一种设计模式,它在软件开发中用于顺序访问聚合对象(如列表、集合等)的元素,而无需暴露其内部结构。这种模式允许在不同的聚合对象间使用相同的遍历逻辑,增强了代码的可复用性和灵活性。 在C#中,...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    C#设计模式学习笔记

    以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    根据《JAVA与设计模式》整理的笔记及示例代码

    这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    图解设计模式 ,结城浩著 学习笔记

    根据给定的信息“图解设计模式,结城浩著学习笔记”,我们可以推断出这份文档主要涉及了设计模式的学习和理解。《图解设计模式》是一本由日本著名程序员结城浩撰写的书籍,该书以图形化的方式深入浅出地讲解了软件...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **迭代器模式**(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **中介者模式**(Mediator):用一个中介对象来封装一系列的对象交互。 - **备忘录模式**(Memento...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    Java设计模式尚硅谷笔记

    本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...

    23种设计模式的解析与Cpp实现

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...通过“23种设计模式的解析与C++实现.pdf”和“Source”文件,读者可以深入学习并实践这些模式,提升自己的编程技能。

    设计模式MarkDown文件描述

    在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定场景下解决常见问题的最佳实践。这里我们关注的是C#设计模式,这是一组用于构建可维护、可扩展和高效软件的模板。让我们逐一探讨这些Markdown文件中...

    设计模式 笔记(附带代码)

    迭代器模式是一种行为设计模式,它能顺序访问聚合对象的元素,而无需暴露其底层表示。迭代器模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这样,客户端代码可以一致地遍历多种数据结构,而...

Global site tag (gtag.js) - Google Analytics