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

Head First 设计模式--Iterator & Composite

阅读更多

Chapter 9 --迭代器模式和组合模式

                                   管理良好的集合

 

1. 迭代器模式依赖于一个名为迭代器的接口。

iterator interface

Structure

  • hasNext()方法告诉我们,是否在这个聚合中还有更多的元素。
  • next()方法返回这个聚合中的下一个对象。
  • remove()方法允许从聚合中删除由next()方法返回的最后一个项。

 

2. 当我们说“集合”(collection)的时候,我们指的是一群对象。其存储方式可以是各式各样的数据结构,例如:列表、数组、散列表,无论用什么方式存储,一律可以视为是集合,有时候也被称为聚合(aggregate)。

 

 

迭代器模式:

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

 

iterator

Structure

  • Aggregate: 有一个共同的接口供所有的聚合使用,这对客户代码是很方便的;将客户代码从集合对象的实现解耦了。
  • ConcreteAggregate: 这个具体聚合持有一个对象的集合,并实现一个方法,利用此方法返回集合的迭代器。每一个具体聚合都要负责实例化一个具体迭代器,此迭代器能够遍历对象集合。
  • Iterator: 这是所有迭代器都必须实现的接口,它包含一些方法,利用这些方法可以在集合元素之间游走。
  • ConcreteIterator: 这个具体迭代器负责管理目前遍历的位置。

 

3. 迭代器模式把在元素之间游走的责任交给迭代器,而不是聚合对象。这不仅让聚合的接口和实现变得更简洁,也可以让聚合更专注在它所应该专注的事情上面(管理对象集合),而不必去理会遍历的事情。使得责任各得其所。

 

4. 对于外部迭代器,客户通过调用next()取得下一个元素。而内部的迭代器则是由迭代器自己控制。在这种情况下,因为客户无法控制遍历的过程,你必须将操作传入给迭代器,所以内部迭代器不如外部迭代器有弹性。



设计原则:

(1) 单一责任:一个类应该只有一个引起变化的原因。
类的每个责任都有改变的潜在区域。超过一个责任,意味着超过一个改变的区域。该原则告诉我们,尽量让每个类保持单一责任。

5. 当一个模块或一个类被设计成只支持一组相关的功能时,我们说它具有高内聚;反之,当被设计成支持一组不相关的功能时,则为低内聚。

6. Collection和Iterator的好处在于,每个Collection都知道如何创建自己的Iterator。只要调用ArrayList上的iterator(),就可以返回一个具体的Iterator,而你根本不需要知道或关心到底使用了哪个具体类,你只要使用它的Iterator接口就可以了。


组合模式:
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

Composite
Structure
  • Client: 客户使用Component接口操作组合中的对象。
  • Component: Component为组合中的所有对象定义一个接口,不管是组合还是叶节点。它也可以为add()、remove()、getChild()和它的操作实现一些默认的行为。
  • Leaf: 叶节点通过实现Composite支持的操作,定义了组合内元素的行为。叶节点没有孩子。叶节点也继承了add()、remove()和getChild()这样的方法,这些方法对叶节点或许没有意义。
  • Composite: Composite的角色是要定义组件的行为,而这样的组件具有子节点。Composite也实现了叶节点相关的操作。其中有一些操作可能对于Composite意义不大,因此在这种情况下可能产生异常。

7. 组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上。也就是说,在大多数情况下,可以忽略对象组合和个别对象之间的差别。

8. 组合包含组件。组件有两种:组合与叶节点元素。听起来有点递归的味道。组合持有一群孩子,这些孩子可以是别的组合或者叶节点元素。但你用这种方式组织数据的时候,最终会得到树形结构(由上而下的树形结构),根部是一个组合,而组合的分支逐渐往下延伸,直到叶节点为止。

9. 组合模式以单一责任设计原则换取透明性(transparency)。即通过让组件的接口同时包含一些管理子节点和叶节点的操作,客户就可以将组合和叶节点一视同仁,一个元素究竟是组合还是叶节点,对客户是透明的。

10. 组合迭代器是一个外部迭代器,它必须维护它在遍历中的位置,以便外部客户可以通过调用hasNext()和next()来驱动遍历。我们的代码必须维护组合递归结构的位置,通常使用堆栈来维护这些位置信息。

11. 空迭代器:该迭代器的hasNext()永远返回false。

12. 我们称包含其他组件的组件为组合对象,而称没有包含其他组件的为叶节点对象。

13. 如果某个组合结构很复杂,或者遍历的代价太高,那么实现组合节点的缓存就很有帮助。比方说,如果你要不断地遍历一个组合,而且它的每一个子节点都需要进行某些计算,那么你就应该使用缓存来临时保存结果,省去遍历的开支。


本章小结:
  • 迭代器允许访问聚合的元素,而不需要暴露它的内部结构。
  • 迭代器将遍历聚合的工作封装进一个对象中。
  • 当使用迭代器的时候,我们依赖聚合提供遍历。
  • 迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
  • 我们应该努力让一个类只分配一个责任。
  • 组合模式提供一个结构,可同时包容个别对象和组合对象。
  • 组合模式允许客户对个别对象以及组合对象一视同仁。
  • 组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
  • 在实现组合模式时,有许多设计上的折衷。你要根据需要平衡透明性和安全性。
0
1
分享到:
评论

相关推荐

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)是设计模式中的两种重要结构型模式,它们在软件设计中有着广泛的应用。这两种模式都属于GoF(Gang of Four)设计模式,旨在解决特定的问题,提升代码...

    Head First 设计模式-中文版

    《Head First 设计模式》是IT领域内广受赞誉的一本书,主要针对C#和Java开发者,深入浅出地介绍了设计模式这一核心编程概念。设计模式是软件开发中经过实践验证的解决方案模板,用于解决常见问题,提升代码的可读性...

    Head.First设计模式_PDF

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...

    HeadFirst设计模式JAVA版源码

    《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...

    [中文]Head-First设计模式

    《Head-First设计模式》是设计模式领域内一本广受欢迎的入门书籍,以其独特的视觉呈现方式和易懂的讲解风格,让初学者也能快速理解并掌握设计模式的精髓。设计模式是软件工程中的一种最佳实践,是解决常见编程问题的...

    head first 设计模式

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...

    headfirst设计模式

    《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

    Head First设计模式 源代码

    《Head First设计模式》是一本深受开发者喜爱的设计模式学习书籍,它以易懂、生动的方式讲解了23种经典的设计模式。源代码是书中理论知识的实践体现,可以帮助读者更深入地理解并应用这些模式。这里我们将围绕这些...

    Head First设计模式 高清 中文版-扫描版

    《Head First设计模式》是一本深受开发者欢迎的设计模式教程,尤其适合初学者入门。这本书以其独特的视觉风格和轻松的叙述方式,将复杂的概念转化为易于理解的故事和互动元素,使得学习设计模式的过程不再枯燥乏味。...

    HEAD FIRST设计模式

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...

    Head First 设计模式 JAVA源码

    《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...

    HeadFirst 设计模式java源代码

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第 11章陆续介绍的设计 5b4 式为Strategy、Observer、Decorator、...

    Head First设计模式官方原码

    《Head First设计模式》是一本深受开发者欢迎的设计模式学习书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,帮助读者深入理解设计模式的核心概念。这本书的官方源码提供了书中所讲解的每个设计模式的实际...

    Head First 设计模式(中文版)

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...

    HeadFirst设计模式(深入浅出设计模式)-高清

    《HeadFirst设计模式》是一本深受开发者喜爱的经典书籍,它以独特的方式深入浅出地讲解了设计模式这一重要编程概念。设计模式是软件工程中经过实践验证的、解决常见问题的有效解决方案,对于提升代码可读性、可维护...

    Head First 设计模式 扫描版

    《Head First 设计模式》是软件开发领域内一本广受欢迎的书籍,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra四位作者共同撰写。这本书以其独特的视觉风格和易于理解的教学方法,深入浅出地介绍了...

Global site tag (gtag.js) - Google Analytics