`
CherryRemind
  • 浏览: 54840 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Design Pattern --------------------- Iterator

    博客分类:
  • Base
阅读更多
好文借鉴
引用
对容器中元素的访问涉及到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中封装了检索元素的方法。
将容器和对容器中元素的操作完全隔开。
大大增加了代码的可重用性。
分享到:
评论

相关推荐

    design-pattern-java.pdf

    自定义语言的实现——解释器模式(五) 自定义语言的实现——解释器模式(六) 迭代器模式-Iterator Pattern 遍历聚合对象中的元素——迭代器模式(一) 遍历聚合对象中的元素——迭代器模式(二) 遍历聚合对象中的...

    JAVA design pattern-java设计模式

    在这个名为"JAVA design pattern-java设计模式"的CHM文件中,我们可能找到了关于如何在Java开发中应用设计模式的详细信息。 设计模式通常分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建,如单例...

    DesignPattern-master.zip

    "DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...

    23种设计模式的C++实现DesignPattern-master.zip

    本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...

    design-pattern-Java设计模式

    行为型模式如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、命令(Command)、迭代器(Iterator)、访问者(Visitor)、备忘录(Memento)、状态(State)、职责链(Chain of Responsibility...

    DesignPattern-85

    "DesignPattern-85"项目显然关注的是设计模式的学习和应用,特别是与Java编程语言相关的实现。在这个项目中,作者旨在记录自己对设计模式的理解,并分享如何更高效地运用这些模式来优化代码。 首先,我们来讨论设计...

    DesignPattern : Iterator

    在给定的"DesignPattern-Iterator"压缩包中,可能包含了关于迭代器模式的实现示例或代码分析,比如Java集合框架中的迭代器使用、自定义迭代器的设计等。通过阅读这些内容,可以更深入地理解迭代器模式在实际编程中的...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...

    design-pattern-in-java

    这个名为"design-pattern-in-java"的项目,显然旨在提供一系列Java实现的设计模式示例,帮助开发者理解和应用这些模式。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都有其特定的目标和适用...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码示例和文档。"design-pattern-master"可能是项目主目录的名字,暗示着这是一个完整的源码仓库。 设计模式分为三大类:创建型...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    Graph-et-Design-Pattern-Iterateur:ISI3 - TP1

    这个“Graph-et-Design-Pattern-Iterateur:ISI3 - TP1”项目显然是关于在Java中实现迭代器模式,特别是在图(Graph)结构中的应用。 首先,我们需要理解迭代器模式的基本概念。迭代器模式提供了一种方法来顺序访问...

    Visitor-and-Iterator-Design-Pattern

    您已经提供了一个迭代器类Iterator ,用户可以创建它来遍历整个表达式树。 该迭代器的特殊之处在于它多次访问树的每个节点。 没有子节点的节点将被访问一次。 有一个孩子的节点被访问两次(访问孩子之前和之后)。 ...

    DesignPatterns-master.zip

    - 迭代器模式(Iterator):顺序访问聚合对象的元素,而又不暴露其底层表示。 - 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    CoreJava-DesignPattern

    CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...

    design-pattern-study:设计模式学习代码

    "design-pattern-study"项目显然是一个专注于设计模式学习和实践的代码库。通过分析其中的代码,我们可以深入理解设计模式的原理和应用。在这个项目中,"design-pattern-study-main"可能包含了不同设计模式的实例...

    Design Pattern英文版

    设计模式(Design Pattern)是软件工程中的一种经验总结,它是在特定上下文中为解决常见问题而提出的一套可复用的解决方案。设计模式并不直接实现为代码,而是提供了一种在面向对象设计中如何处理常见问题的指南。...

    design-pattern-hero:设计模式分配

    在"设计模式英雄"项目中,你可能会学习到如何在实际项目中识别和应用这些模式,理解它们的目的和适用场景,并通过"design-pattern-hero-main"这个主模块来实践。这将帮助你提高代码质量,减少设计错误,并且使得团队...

    设计模式 - Design Pattern

    "Design Pattern"这个压缩包文件很可能包含了一些关于设计模式的实例和文档,特别是提到了"design-pattern\doc\api"目录下的"index.html",这可能是一个交互式的文档或者教程,通过实例帮助开发者更好地理解设计模式...

Global site tag (gtag.js) - Google Analytics