新浦京81707con > 功能介绍 > 迭代器与组合模式,实现迭代器设计模式

原标题:迭代器与组合模式,实现迭代器设计模式

浏览次数:160 时间:2019-05-04

本文的概念性内容出自深远浅出设计格局壹书.

 

正文的概念来源于深刻浅出设计形式1书

本文需结合上壹篇作品(使用C# (.NET Core) 完结迭代器设计方式)一起看.

《Head First设计方式》 读书笔记10 迭代器与构成方式

项目须求

有多个酒楼合并了, 它们分别有友好的菜单. 旅社合并之后要封存那两份菜单.

那五个菜单是这么的:

图片 1

菜单项MenuItem的代码是那般的:

图片 2

中期大家是如此设计的, 那是首先份菜单:

图片 3

这是第2份菜单:

图片 4

上一篇小说大家研商了多个菜单一齐使用的问题.

The Iterator and Composite Patterns

与此同时有八个菜单存在的难点

主题素材正是多少个菜单把专门的学业变复杂了. 举例: 借使一个伙计必要利用两份菜单的话, 那么她就不可能急迅的告诉客户有啥样菜是吻合素食主义者的了.

服务员还有希望有这个供给:

图片 5

打字与印刷菜单, 打字与印刷早餐菜单, 打印午餐菜单, 打字与印刷素食菜谱, 决断有些菜是或不是是素食的.

率先大家尝试一下怎么样完结打字与印刷菜单:

  1. 调用五个菜单下面的getMenuItem()方法来获得各自的菜单项, 由于它们的菜系分歧, 所以供给写两段代码:

图片 6

  1. 打字与印刷五个菜单的菜单项, 一样也是两套代码:

图片 7

  1. 只要还有1份菜单, 那么就须求写三套代码....

现今就很麻烦了. 

须要变动

就当我们觉获得大家的宏图已经充足好的时候, 新的急需来了, 我们不光要支持多样美食指南, 还要支撑美食指南下得以具备子菜单.

诸如小编想在DinerMenu下增添一个甜点子菜单(dessert menu). 以大家脚下的规划, 貌似不可能落到实处该须要.

图片 8

现阶段大家鞭长莫及把dessertmenu放到MenuItem的数组里.

 

怎么消除这么些难点

 假若能找到一种艺术让那七个菜单同时落到实处二个接口就好了. 大家已经领悟, 要把变化的有个别包装起来.

怎么着是变化的片段? 由于分裂目标集结引起的遍历操作.

那大家试试;

  1. 想要遍历早餐项, 大家应用ArrayList的size()和get()方法:

图片 9

  1. 想要遍历午餐项, 大家必要采纳Array的length成员变量以及通过索引访问数组:

图片 10

  1. 要是我们创造叁个目的, 把它称为迭代器, 让它来封装我们遍历集合的措施怎么样?

图片 11

那边, 大家必要早餐菜单创设多个迭代器, 假设还有多余的菜单项未有遍历完, 就获得下四个美食做法项.

  1. 让大家在Array上尝试:

图片 12

大家相应怎么办?

  • 我们需求一种恍若树形的布局, 让其得以容纳/适应菜单, 子菜单以及菜单项.
  • 咱俩还须求保养壹种可以在该协会下遍历全数菜单的点子, 要和行使遍历器一样简单.
  • 遍历条目款项标措施须要更加灵敏, 举个例子, 作者只怕只遍历DinerMenu下的甜品菜单(dessert menu), 可能遍历整个Diner Menu, 包罗甜点菜单.

图片 13

图片 14

标题引进

  餐厅和煎饼屋要合并,要把煎饼屋的美食指南作为早餐菜单,餐厅的美食指南作为午餐菜单。

  可是对于菜单项的记录,前者用的是ArrayList,后者用的是数组,两者都不甘于退换代码达成。

  所以在女应接管理的时候,供给用分裂的点子分别管理那多个菜单,终归菜单项的再次回到值1个是ArrayList二个是数组,遍历的时候也要分头遍历。

 

  此前的求学中直接说要卷入变化的有个别,可是由差别的集结类型所导致的遍历也得以打包吗?

  迭代器方式固然化解这几个主题素材。

 

初识迭代器格局

第三你供给精晓那种形式信赖于1个迭代器接口. 举例那几个:

图片 15

hasNext()方法告诉大家集结中是不是还有多余的条条框框未有遍历到.

next()方法重返下二个条约.

有了这几个接口, 大家能够在任何1种会集上得以完毕该接口.:

图片 16

构成格局定义

整合形式允许你把目的们组合成树形的布局, 从而来代表完全的等级次序. 通过结合, 客户能够对单个对象或对象们的组合展开同样的拍卖.

图片 17

先看一下树形的构造, 具备子成分的因素叫做节点(node), 未有子成分的因素叫做叶子(leaf).

本着大家的须求:

图片 18

菜单Menu就是节点, 菜单项MenuItem正是叶子.

 

针对急需大家得以成立出1种树形结构, 它能够把嵌套的菜谱或菜单项在平等的结构下进展管理.

整合和单个对象是指什么吗?

壹经大家有着八个树形结构的菜系, 子菜单, 也许子菜单和菜单项一齐, 那么就足以说其余二个美食指南都是二个结缘, 因为它能够涵盖别的菜单或菜单项.

而单独的靶子正是菜单项, 它们不含有别的对象.

图片 19

图片 20

图片 21

行使组合格局, 大家能够把一样的操作功效于整合大概单个对象上. 也正是说, 大繁多景色下大家能够忽略对象们的结合与单个对象之间的分化.

该情势的类图:

图片 22

客户Client, 使用Component来操作结合中的对象.

Component定义了具有目的的接口, 包涵组合节点与叶子. Component接口也可能达成了部分暗许的操作, 这里正是add, remove, getChild.

叶子Leaf会承继Component的暗中认可操作, 可是不怎么操作大概并不相符叶子, 这几个过会再说.

叶子Leaf未有子节点.

构成Composite必要为有着子节点的零部件定义行为. 同样还实现了卡片相关的操作, 个中多少操作恐怕不吻合整合, 那种景况下丰裕或然会产生.

迭代器情势

  迭代器形式(Iterator Pattern)依傍于贰个名称为迭代器的接口。

图片 23

 

 

  注:聚合与集合同义。

  以往,壹旦有了那个接口,就足感到各样对象集结达成迭代器:数组、列表、散列表……

 

修改代码

概念迭代器接口:

图片 24

接下来再DinerMenu上得以落成迭代器接口:

图片 25

接下来利用迭代器来修改DinerMenu菜单:

图片 26

注意: 不要一向回到集结, 因为这么会暴光内部落成.

createIterator()方法重返的是迭代器的接口, 客户并无需知道DinerMenu是怎么着珍贵菜单项的, 也不须求DinerMenu的迭代器是怎么落到实处的. 它只是用迭代器来遍历菜单里面包车型地铁条约.

最后服务员的代码如下:

图片 27

测试代码:

图片 28

图片 29

本文由新浦京81707con发布于功能介绍,转载请注明出处:迭代器与组合模式,实现迭代器设计模式

关键词: 新浦京81707con 设计模式

上一篇:前端面试问题

下一篇:没有了