第7章 迭代器及组合模式.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 迭代器与组合模式 回顾 模板方法定义了算法的步骤,把这些步骤的实现延迟到子类 模板方法模式为我们提供一种代码复用的重要技巧 模板方法的抽象类可以定义具体方法、抽象方法和Hook Hook是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。 目标 迭代器允许访问聚合的元素,而不需要暴露它的内部结构 迭代器将遍历集合的工作封装进一个对象中 当使用迭代器的时候,我们依赖聚合提供遍历 迭代器提供一个通用的接口,可以遍历聚合的项,当编码使用聚合的项时,就可以使用多态机制 组合模式提供一个结构,可同时包含个别对象和组合对象 使用组合结构,我们能把相同操作应用在组合和个别对象上。 举例 两家餐厅(一家做早餐的,另一家做午餐的),由于市场竞争,餐厅进行合并,我们来分析会出现什么问题? 问题分析 问题分析 解决问题 迭代器模式 它依赖于一个迭代器接口: 一旦我们有了这个接口,就 可以为各种对象集合实现迭代器 用迭代器改写餐厅菜单-1 用迭代器改写餐厅菜单-2 代码 运行 UML类图 定义迭代器模式 定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 注意: ①迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示; ②把游走的任务放在迭代器上,而不是聚合上。这样简化聚合的接口和实现,也让责任各得其所。 模式结构 包括四种角色 举例 由于只有早餐和午餐,缺乏竞争力,将咖啡厅也合并进来,供应晚餐 合并餐厅代码 运行 问题 我们发现:在合并新餐厅代码中每次有新菜单加入,我们必须加入新代码,在程序中调用三次printMenu( ).违背“开放-关闭”原则 运行 问题 我们希望午餐后提供一份甜点”子菜单”(菜单中的菜单) 解决问题 我们需要某种树形结构,可以容纳菜单、子菜 单和菜单项 我们需要确定能够在每个菜单的各个项之间游 走,而且至少像用迭代器一样方便 我们能够弹性在菜单项之间游走,如:可以只 遍历甜点菜单,或者可以遍历餐厅整个菜单 定义组合模式 定义:允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象(叶子接点)及对象组合(中间节点)。 组合模式关键在于无论是个体对象还是组合对象都实现了相同的接口或都是同一个抽象类的子类。 模式结构:三种角色 UML类图 利用组合设计菜单 代码 代码 代码 运行 总结 迭代器允许访问聚合的元素,而不需要暴露它的内部结构 迭代器将遍历集合的工作封装进一个对象中 当使用迭代器的时候,我们依赖聚合提供遍历 迭代器提供一个通用的接口,可以遍历聚合的项,当编码使用聚合的项时,就可以使用多态机制 组合模式提供一个结构,可同时包含个别对象和组合对象 使用组合结构,我们能把相同操作应用在组合和个别对象上。 设计模式 设计模式 ①每家餐厅都有菜单项: ②每家餐厅菜单项存储方式不同 合并前,两家餐厅的 菜单项存储格式不一样 ③合并后的新餐厅能够遍历菜单每一项,可以打印出所有素食菜单项 我们必须实现两个不同的循环,分别 处理这两个不同的菜单 如果还有第三家餐厅 合并进来,需要三 个循环…… 现在我们创建一个迭代器对象(Iterator),利用 它来封装”便历集合内的每个对象的过程”。 Iterator iterator=breakfastMenu.createIterator(); while(iterator.hasNext()){ MenuItem menuItem=(MenuItem)iterator.next(); } Iterator iterator=DinerMenu.createIterator(); while(iterator.hasNext()){ MenuItem menuItem=(MenuItem)iterator.next(); } 遍历集合的每个对象过程 封装起来! 不用暴露出对象的存储形式 看不到ArrayList、数组 《interface》 Iterator hasNext() next() remove DinerMenuIterator hasNext() next() remove() 返回一个针对该集合的具体迭代器 不创建自己的迭代器,而是调用 菜单项ArrayList的iterator()方法,获得具体迭代器。 让这两家餐厅菜单类都实现Menu接口 每个餐厅菜单类都必须负责 建立适当的具体迭代器。 ①集合(Aggregate):一个接口,定义具体集合需实现的操作 ②具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体 集合按照一定结构存储对象,具体集合

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档