`

5-Iterators: decoupling algorithms from containers

阅读更多

In the process, he realized that iterators are central to the use of algorithms, because they decouple the algorithms from the specific type of containe...只看这个,不是很好理解。

找了两个资料,感觉是比较好的例子:

<1>

Iterator模式的疑问

http://www.jdon.com/jivejdon/thread/34664

 

JAVA COLLECTION类都提供Iterator模式来迭代的取数据,比如ArrayList最终实现Iterable接口,但是
(一)
for(int i=0,i<size;i++){
a.get(i);
......
}

(二)
Iterator i = a.inerator();
while(i.hasNext()){
......
}

1和2都能遍历list实例a的所有元素,没看出用iterator有什么优势。

起先我的想法就是Iterator提供了List的一个不可变视图,如果你想把List发布给一个方法查看而又不希望这个方法能修改它,则发给给该方法一个List的不可更改视图,但是这个想法有几个问题:
(1)Iterator并非不可改,有remove方法
(2)如果是发布不可变试图的话完全可以用Collections.unmodifyList(a);
(3)如果仅仅是发布不可变视图的话也未必要是Iterator这个形式,试想一下,一个方法的参数是Iterator将是多么晦涩难理解的,我也没见过这个用的。

我的第二个想法是Iterable接口是所有Collection对象都必实现的,也许在List里体现不出优势,在其他集合类里能体现出来,List实现Iterable只是List作为集合类所顺理成章实现的。

到底Iterator的优势在哪里

 

其中一个评论比较有总结性,这应该就是面向接口编程+遵守规范的优越性!

 

为什么使用iterator,就是因为用***.iterator 来隐藏***的内部实现。

 

<2>

Iterator模式的几种用法:

http://www.jdon.com/jivejdon/thread/32038

Iterator模式的几种用法

在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。

因此在这里写几个例子,来加深大家对Iterator模式的理解。

 

对容器中元素的访问涉及到3个方面。

1.容器的类型

2.检索容器内元素的方法

3.对元素的操作

比如说我们有一个表示书店的book_store类。里面保存了各种各样的book类的实例。

book类有name和type两种属性。表示书的名字和类别。

因此book_store类内部会用一个容器来保存book的实例。比如list。

class book

{

public:

string name;

string type;

};

 

class book_store

{

private:

list<book> m_books;

};

 

我们现在有这样一个简单的应用,那就是输出所有的书名到屏幕。

那么我们来看一下在引入Iterator模式前有那几种实现方法,各有什么缺点。

1.给book_store类增加一个print_book_name的函数。来实现这个功能。

这样做的缺点有两个:

(1).将输入输出逻辑和业务对象绑定在一起,导致了今后系统难以变更。

(2).输出逻辑和内部实现绑定。

比如现在要把输出到屏幕改成输出到log文件的话,那么就需要修改print_book_name了。

2.给book_store类增加一个get_list函数。然后写一个print_book类来负责打印书名的列表。这是一个初学者常用的方式。表面上看来似乎两个类各担其责,一个表示业务对象一个负责打印。

如果需要打印到log文件的话,只要新增加一个log_book类,book_store和print_book都不受影响。解决了上面的这个问题。

这样做的缺点是:

(1).把book_store类的内部实现给暴露出来了,违反了封装的原则。

如果现在把内部容器类型从list换成了vector的话,就要修改输出逻辑了。也就是说,要同时改写print_book类和log_book类。

3.增加一个list和vector类共同的基类/接口,比如I_container。然后给book_store类增加一个get_books函数,返回I_container。

这在一定程度上解决了上面的问题。但是并不彻底。应为还是暴露了内部的实现,只不过从list上升到了I_container。

· 如果现在系统发生了变化,book_store不再在本地保存books了,而是需要通过网络取得的话,print_book和log_book就无法对应了。

· 另一个限制是,我需要一个新的机能,那就是打印所有type为”烹饪书”的机能的话,就需要一个print_cook_book类了,而这里边的格式化代码和输出代码和print_book是相同的。重复代码是维护的噩梦。

 

接下来我们看一下Iterator模式如何解决以上的这些问题。

首先,我们引入一个I_iterator的Interface。

然后创建一个I_iterator的实现类all_book_iterator。这个类可以迭代book_store中的所有book。

接下来创建一个print_book类,从I_iterator中取得每一个book,然后打印到屏幕。

 

下面我们看一下如何对应上面的这些需求变更。

1.要求输出到log文件

追加一个log_book类,其他都类都不需要改变。

2.将内部容器从list变成vector。

修改iterator中的相关代码。Iterator的使用者不会受到影响。

3.从网络取得数据。

修改iterator中的相关代码。Iterator的使用者不会受到影响。

4.按照type检索

在iterator中添加一个type的属性,或者是构造一个新的type_search_iterator。

在iterator中把不符合检索条件的book过滤掉。

5.按照某一特定顺序输出book名到屏幕,或是log文件。

实现一个按该顺序输出的iterator。

6.以同样的方式打印cd_store。

实现对应于cd_store的iterator。

 

可见,iterator模式在各种iterator中封装了检索元素的方法。

将容器和对容器中元素的操作完全隔开。

大大增加了代码的可重用性。

分享到:
评论

相关推荐

    Thinking in Patterns _ Problem Solving Techniques using Java.

    **迭代器:将算法与容器解耦 (Iterators: Decoupling Algorithms from Containers)** - **类型安全迭代器 (Type-Safe Iterators)** - 确保迭代器的安全性和有效性。 ##### 5. **工厂:封装对象创建 (Factories: ...

    vue.js v2.5.17

    vue.js vue.min.js vue-router.js vue-router.min.js

    DM8-SQL语言详解及其数据管理和查询操作指南

    内容概要:本文档是关于DM8数据库系统的SQL语言使用手册,全面介绍了其SQL语言的基础特性、功能、语法规则及相关使用方法。手册首先概述了DM_SQL的特点和它支持的各种数据类型(例如:数值、字符串、日期时间类型等)及其对应的表达式。接下来深入探讨了一系列高级话题,涵盖数据定义语句-DDL、数据操纵语句-DML和数据控制语句,具体讲解了多种表类型(常规表、HUGE表、外部表)的创建与管理,以及索引机制(全文索引、位图连接索引等)。此外还提供了丰富的实例示范,确保读者能直观理解并应用于实际项目。同时,文档也阐述了各种系统级别的功能,如日志和检查点管理、MPP管理和统计信息生成等功能的使用方法。 适合人群:具有一定数据库基础知识并且有意深入了解DM8数据库系统特性的开发工程师、数据库管理人员或相关专业技术人员。 使用场景及目标:①指导开发人员掌握DM8中各类SQL命令的实际运用技巧;②帮助运维人员学会通过SQL来进行有效的数据维护与优化,从而提升数据库的整体性能。 其他说明:该手册不仅仅是SQL理论的讲述,而是通过大量的实例演示让使用者更加熟悉日常的工作任务。对于复杂的企业级应用场景尤其有

    1108_ba_open_report.pdf

    1108_ba_open_report

    anslow_02_0109.pdf

    anslow_02_0109

    以下是OpenCV在不同操作系统下的下载与安装教程

    opencv下载安装教程

    aronson_01_0707.pdf

    aronson_01_0707

    Designing Deep Learning Systems. A software engineer's guide - 2023.pdf

    Wang Chi, Szeto Donald - Designing Deep Learning Systems. A software engineer's guide

    基于豆瓣图书网站的图书数据分析与可视化

    使用Python语言对Django框架进行设计,选用豆瓣读书网站(https://book.douba n.com/)作为研究对象,基于用户的阅读行为数据,运用网络爬虫技术来抓取所需数据,随后对这些数据进行深度清理,存储到数据库中。借助ECharts的可视化工具,深入分析和直观展示,实现数据分析与可视化。

    barbieri_01_0108.pdf

    barbieri_01_0108

    brown_3ck_01_0718.pdf

    brown_3ck_01_0718

    基于Python的Django-vue学生选课系统实现源码-说明文档-演示视频.zip

    关键词:学生选课系统;Python语言;MySQL数据库 学生选课系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写,使用了Django框架。该系统从三个对象:由管理员和学生、教师来对系统进行设计构建。主要功能包括:个人信息修改,对学生、教师信息、课程信息、课程分类、选择课程、班级、成绩通知、教室信息、系统管理等功能

    ganga_02_0909.pdf

    ganga_02_0909

    毕设-springboot大学生竞赛管理系统(免费领取)

    毕设-springboot大学生竞赛管理系统(免费领取)

    agenda_3cd_01_0716.pdf

    agenda_3cd_01_0716

    Swift语言教程:从入门到实践 Swift是苹果公司开发的一种多范式编程语言,用于iOS、macOS、watchOS和tvOS应用开发 它结合了C和Objective-C的优点,同时提供了现代编程语

    Swift语言教程:从入门到实践 Swift是苹果公司开发的一种多范式编程语言,用于iOS、macOS、watchOS和tvOS应用开发。它结合了C和Objective-C的优点,同时提供了现代编程语言的许多特性,如安全性、速度以及表达力。以下是从入门到实践的Swift语言教程。 一、Swift基础 1. Swift环境设置 Xcode安装:下载并安装最新版本的Xcode,这是开发Swift应用的集成开发环境(IDE)。 创建项目:在Xcode中创建一个新的Swift项目,了解项目结构。 2. 基本语法 变量与常量:使用var声明变量,使用let声明常量。 数据类型:整数(Int)、浮点数(DoubleFloat)、字符串(String)、布尔值(Bool)等。 类型安全:Swift是强类型语言,每个变量和常量在声明时都需要指定类型(尽管Swift也能自动推断类型)。 运算符:算术运算符、比较运算符、逻辑运算符等。 3. 控制流 条件语句:if、else if、else。 循环语句:for循环、while循环、repeat-while循环。 控制转移语句:break、continue

    【宝城期货-2025研报】钢材、铁矿石日报:关税扰动不断,钢矿弱势运行.pdf

    【宝城期货-2025研报】钢材、铁矿石日报:关税扰动不断,钢矿弱势运行.pdf

    anslow_05_0110.pdf

    anslow_05_0110

    c盘满了怎么清理.zip

    介绍了清理C盘空间的多种方法,包括使用系统工具、清理临时文件、卸载残留文件、移动用户文件夹、清理系统日志和虚拟内存等,旨在帮助用户有效释放C盘空间,提升电脑性能。

Global site tag (gtag.js) - Google Analytics