一天学习一个设计模式之迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式,需要对聚集有多种方式遍历时,也可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一接口。迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以做到不暴露集合的内部结构,又可让外部透明地访问集合内部的数据。

代码如下:

 1 /**
 2  * 迭代器抽象类
 3  */
 4 public abstract class Iterator {
 5     /**
 6      * 迭代方法:移动到第一个元素
 7      * @return
 8      */
 9     public abstract Object first();
10
11     /**
12      * 迭代方法:移动到下一个元素
13      * @return
14      */
15     public abstract Object next();
16
17     /**
18      * 用于定义得到开始对象、得到下一个对象、判断
19      * 是否到结尾、当前对象等抽象方法,统一接口
20      * 迭代方法:是否为最后一个元素
21      * @return
22      */
23     public abstract boolean isDone();
24
25     /**
26      * 迭代方法:返还当前元素
27      * @return
28      */
29     public abstract Object currentItem();
30 }
 1 /**
 2  * 具体迭代器类继承迭代器抽象类
 3  */
 4 public class ConcreteIterator extends Iterator {
 5
 6     /**
 7      * 定义了一个具体聚集对象
 8      */
 9     private ConcreteAggregate aggregate;
10     private int current=0;
11
12     public ConcreteIterator(ConcreteAggregate aggregate) {
13        this.aggregate=aggregate;
14     }
15
16     /**
17      * 得到聚集的第一个对象
18      * @return
19      */
20     @Override
21     public Object first() {
22         return aggregate.getElement(0);
23     }
24
25     /**
26      * 得到聚集的下一个对象
27      * @return
28      */
29     @Override
30     public Object next() {
31         Object ret=null;
32         current++;
33         if (current<aggregate.getCount())
34         {
35             ret=aggregate.getCount();
36         }
37         return ret;
38     }
39
40     /**
41      * 判断当前是否遍历到结尾,到结尾返回true
42      * @return
43      */
44     @Override
45     public boolean isDone() {
46         return current>=aggregate.getCount()?true:false;
47     }
48
49     @Override
50     public Object currentItem() {
51         return aggregate.getElement(current);
52     }
53 }
1 /**
2  * 聚集抽象类
3  */
4 public abstract class Aggregate {
5     public abstract Iterator createIterator();
6 }
 1 /**
 2  * 具体聚集类继承聚集抽象类
 3  */
 4 public class ConcreteAggregate extends Aggregate {
 5
 6     /**
 7      * 声明一个List泛型变量,用于存放聚合对象,用ArrayList同样可以实现
 8      */
 9     private List<Object> items=new ArrayList<>();
10
11     public ConcreteAggregate(List<Object> list) {
12         this.items=list;
13     }
14
15     @Override
16     public Iterator createIterator() {
17         return new ConcreteIterator(this);
18     }
19
20     /**
21      * 返回聚集总个数
22      * @return
23      */
24     public int getCount() {
25         return items.size();
26     }
27
28     /**
29      * 取值方法:向外界提供聚集元素
30      */
31     public Object getElement(int index){
32         if (index<getCount()){
33             return items.get(index);
34         }
35         else {
36             return null;
37         }
38     }
39 }
 1 public class Client {
 2     public static void main(String[] args) {
 3
 4         List<Object> list=new ArrayList<>();
 5         list.add("大鸟");
 6         list.add("小菜");
 7         list.add("行李");
 8         list.add("老外");
 9         list.add("公交内部员工");
10         list.add("小偷");
11
12         ConcreteAggregate a=new ConcreteAggregate(list);
13         Iterator i=a.createIterator();
14         Object item=i.first();
15         System.out.println("第1:"+item.toString());
16         while (!i.isDone()){
17             System.out.println(i.currentItem()+"请买车票");
18             i.next();
19         }
20     }
21 }

原文地址:https://www.cnblogs.com/gousheng107/p/8177445.html

时间: 2024-10-10 20:14:45

一天学习一个设计模式之迭代器模式的相关文章

一天学习一个设计模式之原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节.例如:有一张个人简历(此为具体原型),需要在这个基础上复印十份简历.如果不复印,那就得手写10份简历,耗时耗力.这就是原型模式所表现出来的优势.具体代码如下: 1 /** 2 * 抽象原型角色,这是一个抽象角色,通常由一个JAVA接口或JAVA抽象类实现. 3 * 此角色给出所有的暗送秋波原型类所需要的接口 4 */

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

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

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

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

设计模式之迭代器模式详解(foreach的精髓)

作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和各位对话了,前段时间为了更加逼真的解释设计模式,LZ费尽心思给设计模式加入了故事情节,本意是为了让各位在看小说的过程中就可以接触到设计模式,不过写到现在,LZ最深的感触就是,构思故事的时间远远超过了LZ对设计模式本身的研究. 本章介绍迭代器模式,不再采用故事嵌入的讲解方式,主要原因是因为迭代器模式本

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

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

2018.4.30 设计模式之迭代器模式

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

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

【Unity与23种设计模式】迭代器模式(Iterator)

GoF中定义: "在不知道集合内部细节的情况下,提供一个按序方法存取一个对象集合体的每一个单元." 迭代器模式由于经常使用到 已经被现代程序设计语言纳为标准语句或收录到标准函数库中 在C#中,经常使用泛型存储对象 当想按序存取这些泛型容器时,都会使用C#的foreach语句 foreach语句就是一个能顺序访问一个集合的方法 它便是C#语言内置的迭代器模式 当然 其他现代语言也提供了类似的语句

学习大话设计模式02_工厂模式 进阶至 策略模式

1 /** 2 * 现金收费抽象类 3 * @author Monica 4 * 5 */ 6 public abstract class CashSuper { 7 /** 8 * 现金收取超类的抽象方法 9 * @param money 收取现金,参数为原价 10 * @return 返回当前价 11 */ 12 public abstract double acceptCash(double money); 13 } 14 15 /** 16 * 正常收费子类 17 * @author M