版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计模式第七章第七章迭代器与组合模式迭代器与组合模式设计模式2回顾q 模板方法定义了算法的步骤,把这些步骤的实现延迟到子类q 模板方法模式为我们提供一种代码复用的重要技巧q 模板方法的抽象类可以定义具体方法、抽象方法和Hookq Hook是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。设计模式3目标q 迭代器允许访问聚合的元素,而不需要暴露它的内部结构q 迭代器将遍历集合的工作封装进一个对象中q 当使用迭代器的时候,我们依赖聚合提供遍历q 迭代器提供一个通用的接口,可以遍历聚合的项,当编码使用聚合的项时,就可以使用多态机制q 组合模式提供一个结构,可同时包含个别
2、对象和组合对象q 使用组合结构,我们能把相同操作应用在组合和个别对象上。设计模式4举例q 两家餐厅(一家做早餐的,另一家做午餐的),由于市场竞争,餐厅进行合并,我们来分析会出现什么问题?每家餐厅都有菜单项:每家餐厅菜单项存储方式不同设计模式5问题分析合并前,两家餐厅的菜单项存储格式不一样设计模式6问题分析合并后的新餐厅能够遍历菜单每一项,可以打印出所有素食菜单项我们必须实现两个不同的循环,分别处理这两个不同的菜单如果还有第三家餐厅合并进来,需要三个循环设计模式7解决问题现在我们创建一个迭代器对象(Iterator),利用它来封装”便历集合内的每个对象的过程”。Iterator iterator
3、=breakfastMenu.createIterator(); while(iterator.hasNext()MenuItem menuItem=(MenuItem)iterator.next();Iterator iterator=DinerMenu.createIterator(); while(iterator.hasNext()MenuItem menuItem=(MenuItem)iterator.next();遍历集合的每个对象过程封装起来!不用暴露出对象的存储形式看不到ArrayList、数组设计模式8迭代器模式q 它依赖于一个迭代器接口: 一旦我们有了这个接口,就 可以为各
4、种对象集合实现迭代器interfaceIteratorhasNext()next()removeDinerMenuIteratorhasNext()next()remove()设计模式9用迭代器改写餐厅菜单-1返回一个针对该集合的具体迭代器设计模式10用迭代器改写餐厅菜单-2不创建自己的迭代器,而是调用菜单项ArrayList的iterator()方法,获得具体迭代器。让这两家餐厅菜单类都实现Menu接口设计模式11代码每个餐厅菜单类都必须负责建立适当的具体迭代器。设计模式12运行设计模式13UML类图设计模式14定义迭代器模式q定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其
5、内部的表示。q 注意: 迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示; 把游走的任务放在迭代器上,而不是聚合上。这样简化聚合的接口和实现,也让责任各得其所。设计模式15模式结构q包括四种角色集合(Aggregate):一个接口,定义具体集合需实现的操作具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按照一定结构存储对象,具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器迭代器(Iterator):一个接口,规定遍历具体集合的方法具体迭代器(ConcreteIterator)实现迭代器接口的类的实例设计模式16举例q由于只
6、有早餐和午餐,缺乏竞争力,将咖啡厅也合并进来,供应晚餐我们使用很常见的存储结构Hashtable我们不是取得整个Hashtable的迭代器,而是取值部分的迭代器设计模式17合并餐厅代码有什么问题?设计模式18运行设计模式19问题q 我们发现:在合并新餐厅代码中每次有新菜单加入,我们必须加入新代码,在程序中调用三次printMenu( ).违背“开放-关闭”原则我们利用ArrayList将每个餐厅菜单存储进来利用迭代器遍历菜单设计模式20运行设计模式21问题q我们希望午餐后提供一份甜点”子菜单”(菜单中的菜单)所有菜单123BreakfastMenuDinerMenuCafeMenuArrayL
7、ist,持有每家餐厅的菜单MenuItemMenuItemMenuItemArrayListMenuItemMenuItemMenuItemArray早餐菜单午餐菜单持有一份子菜单,但是不能直接把它赋给菜单项数组,因为类型不同。MenuItemMenuItem甜点菜单KEYMenuItemKEYMenuItem晚餐菜单Hashtable午餐菜单设计模式22解决问题q 我们需要某种树形结构,可以容纳菜单、子菜 单和菜单项q 我们需要确定能够在每个菜单的各个项之间游 走,而且至少像用迭代器一样方便q 我们能够弹性在菜单项之间游走,如:可以只 遍历甜点菜单,或者可以遍历餐厅整个菜单设计模式23定义组
8、合模式q定义:允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象(叶子接点)及对象组合(中间节点)。q 组合模式关键在于无论是个体对象还是组合对象都实现了相同的接口或都是同一个抽象类的子类。q 模式结构:三种角色抽象组件(Component):是一个接口(抽象类),该接口定义了个体对象和组合对象需要实现的关于操作其子节点的方法或用于操作其自身的方法。Composite节点:实现Component接口类的实例,同时可以含有其它Composite节点或Leaf节点的引用Leaf节点:实现Component接口类的实例,不可以包含其它Composite节点或L
9、eaf节点的引用设计模式24UML类图interfaceComponent+add(Component):void+remove(Component)+getChild(int):Component+operation():voidLeaf+operation():voidCompositechild:LinkedList+add(Component):void+remove(Component)+getChild(int):Component+operation():void设计模式25利用组合设计菜单抽象组件有些方法适合菜单项,有些方法适合于菜单;面对这种情况,最好抛出运行时异常设计模式26代码Leaf节点,实现菜单项设计模式27代码Composite节点,组合菜单迭代器设计模式28代码设计模式29运行设计模式30总结q 迭代器允许访问聚合的元素,而不需要暴露它的内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中九年级数学教学设计:相似三角形判定定理三的深度教学与实战演练
- 船体装配工安全知识宣贯测试考核试卷含答案
- 初中化学九年级溶解度核心考点分层教学设计
- 社会体育指导员岗前技巧考核试卷含答案
- 加气混凝土切割工安全文化测试考核试卷含答案
- 电子设备装接工安全技能竞赛考核试卷含答案
- 高二数学《空间向量与垂直关系》教学设计
- 初中八年级德育教学设计:化解冲突与友善同行的实践路径探究
- 小学劳动三年级上册全册教学设计:核心素养导向的单元整体实施
- 乳化香精配制工达标评优考核试卷含答案
- 2026年全国行政执法人员执法资格考试必考题库与答案
- 2025年中国干粉砂浆市场调查研究报告
- 重庆数字资源集团招聘考试真题2025
- 施工单位商务汇报体系
- Python程序设计基础及实践(慕课版 第2版)课件 郭炜 1. Python初探 -7. 组合数据类型(3)字典和集合
- 15189认可培训课件
- 《物流数据分析》课件-任务6.3 节约里程法的Excel求解
- 加利福尼亚批判性思维技能测试后测试卷班附有答案
- 2020执业药师考试中药学专业知识二真题及答案
- 统编版五年级语文上册习作《漫画老师》优秀课件
- 计算机等级考试二级《Python语言程序设计》培训教学课件
评论
0/150
提交评论