《迭代器与组合模式》ppt课件_第1页
《迭代器与组合模式》ppt课件_第2页
《迭代器与组合模式》ppt课件_第3页
《迭代器与组合模式》ppt课件_第4页
《迭代器与组合模式》ppt课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、设计模式第七章第七章迭代器与组合方式迭代器与组合方式设计模式回想q 模板方法定义了算法的步骤,把这些步骤的实现延迟到子类q 模板方法方式为我们提供一种代码复用的重要技巧q 模板方法的笼统类可以定义详细方法、笼统方法和Hookq Hook是一种方法,它在笼统类中不做事,或者只做默许的事情,子类可以选择要不要去覆盖它。设计模式目的q 迭代器允许访问聚合的元素,而不需求暴露它的内部构造q 迭代器将遍历集合的任务封装进一个对象中q 当运用迭代器的时候,我们依赖聚合提供遍历q 迭代器提供一个通用的接口,可以遍历聚合的项,当编码运用聚合的项时,就可以运用多态机制q 组合方式提供一个构造,可同时包含个别对象

2、和组合对象q 运用组合构造,我们能把一样操作运用在组合和个别对象上。设计模式举例q 两家餐厅(一家做早餐的,另一家做午餐的),由于市场竞争,餐厅进展合并,我们来分析会出现什么问题?每家餐厅都有菜单项:每家餐厅菜单项存储方式不同设计模式问题分析合并前,两家餐厅的菜单项存储格式不一样设计模式问题分析合并后的新餐厅可以遍历菜单每一项,可以打印出一切素食菜单项我们必需实现两个不同的循环,分别处置这两个不同的菜单假设还有第三家餐厅合并进来,需求三个循环设计模式处理问题如今我们创建一个迭代器对象(Iterator),利用它来封装便历集合内的每个对象的过程。Iterator iterator=breakfa

3、stMenu.createIterator(); while(iterator.hasNext()MenuItem menuItem=(MenuItem)iterator.next();Iterator iterator=DinerMenu.createIterator(); while(iterator.hasNext()MenuItem menuItem=(MenuItem)iterator.next();遍历集合的每个对象过程封装起来!不用暴显露对象的存储方式看不到ArrayList、数组设计模式迭代器方式q 它依赖于一个迭代器接口:q 一旦我们有了这个接口,就q 可以为各种对象集合实现

4、迭代器IteratorhasNext()next()removeDinerMenuIteratorhasNext()next()remove()设计模式用迭代器改写餐厅菜单-1前往一个针对该集合的详细迭代器设计模式用迭代器改写餐厅菜单-2不创建本人的迭代器,而是调用菜单项ArrayList的iterator()方法,获得详细迭代器。让这两家餐厅菜单类都实现Menu接口设计模式代码每个餐厅菜单类都必需担任建立适当的详细迭代器。设计模式运转设计模式UML类图设计模式定义迭代器方式q定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。q留意:q 迭代器方式让我们能游走于聚合内

5、的每一个元素,而又不暴露其内部的表示;q 把游走的义务放在迭代器上,而不是聚合上。这样简化聚合的接口和实现,也让责任各得其所。设计模式方式构造q包括四种角色集合(Aggregate):一个接口,定义详细集合需实现的操作详细集合(ConcreteAggregate):详细集合是实现集合接口的类的实例,详细集合按照一定构造存储对象,详细集合该当有一个方法,该方法前往一个针对该集合的详细迭代器迭代器(Iterator):一个接口,规定遍历详细集合的方法详细迭代器(ConcreteIterator)实现迭代器接口的类的实例设计模式举例q由于只需早餐和午餐,缺乏竞争力,将咖啡厅也合并进来,供应晚餐我们运

6、用很常见的存储构造Hashtable我们不是获得整个Hashtable的迭代器,而是取值部分的迭代器设计模式合并餐厅代码有什么问题?设计模式运转设计模式问题q 我们发现:在合并新餐厅代码中每次有新菜单参与,我们必需参与新代码,在程序中调用三次printMenu( ).违背“开放-封锁原那么我们利用ArrayList将每个餐厅菜单存储进来利用迭代器遍历菜单设计模式运转设计模式问题q我们希望午餐后提供一份甜点子菜单(菜单中的菜单)一切菜单123BreakfastMenuDinerMenuCafeMenuArrayList,持有每家餐厅的菜单MenuItemMenuItemMenuItemArray

7、ListMenuItemMenuItemMenuItemArray早餐菜单午餐菜单持有一份子菜单,但是不能直接把它赋给菜单项数组,由于类型不同。MenuItemMenuItem甜点菜单KEYMenuItemKEYMenuItem晚餐菜单Hashtable午餐菜单设计模式处理问题q 我们需求某种树形构造,可以包容菜单、子菜q 单和菜单项q 我们需求确定可以在每个菜单的各个项之间游q 走,而且至少像用迭代器一样方便q 我们可以弹性在菜单项之间游走,如:可以只q 遍历甜点菜单,或者可以遍历餐厅整个菜单设计模式定义组合方式q定义:允许将对象组合成树形构造来表现“整体/部分层次构造。组合能让客户以一致的

8、方式处置个别对象(叶子接点)及对象组合(中间节点)。q组合方式关键在于无论是个体对象还是组合对象都实现了一样的接口或都是同一个笼统类的子类。q方式构造:三种角色笼统组件(Component):是一个接口(笼统类),该接口定义了个体对象和组合对象需求实现的关于操作其子节点的方法或用于操作其本身的方法。Composite节点:实现Component接口类的实例,同时可以含有其它Composite节点或Leaf节点的援用Leaf节点:实现Component接口类的实例,不可以包含其它Composite节点或Leaf节点的援用设计模式UML类图Component+add(Component):void

9、+remove(Component)+getChild(int):Component+operation():voidLeaf+operation():voidCompositechild:LinkedList+add(Component):void+remove(Component)+getChild(int):Component+operation():void设计模式利用组合设计菜单笼统组件有些方法适宜菜单项,有些方法适宜于菜单;面对这种情况,最好抛出运转时异常设计模式代码Leaf节点,实现菜单项设计模式代码Composite节点,组合菜单迭代器设计模式代码设计模式运转设计模式总结q 迭代器允许访问聚合的元素,而不需求暴露它的内部构造

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论