设计模式之迭代器与组合模式(三)

如今咱们已经能愉快地看着一页一页罗列出来的菜单进行点菜了。如今又有的小伙伴但愿可以加上一份餐后甜点的“子菜单”。怎么办呢?咱们不单单要支持多个菜单,甚至还要支持菜单中的菜单。学习

若是咱们能让甜点菜单变成餐厅菜单集合的一个元素,那该有多好。可是根据如今的实现,根本作不到呀。咱们想要的是这样的:设计

咱们须要什么

如今咱们遇到的现实问题是,咱们的系统已经达到了一个复杂的级别,若是如今不从新设计,就没法容纳将来增长的菜单或子菜单等需求。3d

因此,在咱们的新设计中,真正须要些什么呢?对象

  • 咱们须要某种树形结构,能够容纳菜单、子菜单和菜单项
  • 咱们须要肯定可以在每一个菜单的各个项之间游走,并且至少要像如今用迭代器同样方便
  • 咱们也须要可以更有弹性地在菜单项之间游走。比方说,可能只须要遍历甜点菜单,或者能够遍历餐厅的整个菜单(包括甜点菜单在内)。

定义组合模式

没错,咱们要介绍另外一个模式解决这个难题。咱们并无放弃迭代器--它仍然是咱们解决方案中的一部分--然而,管理菜单的问题已经到了一个迭代器没法解决的新维度。因此,咱们将倒退几步,改用组合模式来实现。blog

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

让咱们以菜单为例思考这一切:这个模式可以建立一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。经过将菜单和项放在相同的结构中,咱们建立了一个“总体/部分”层次结构,即由菜单和菜单项组成的对象树。可是能够将它视为一个总体,像是一个丰富的大菜单。迭代器

一旦有了丰富的大彩蛋,咱们就可使用这个模式来“统一处理个别对象和组合对象”。这意味着什么?它意味着,若是咱们有了一个树形结构的菜单、子菜单和可能还带有菜单项的子菜单,那么任何一个菜单都是一种“组合”。im

由于它既能够包含其余菜单,也能够包含菜单项。个别对象只是菜单项--并未持有其余对象。就像你将看到,使用一个遵守组合模式的设计,让咱们可以写出简单的代码,就可以对整个菜单结构应用相同的操做。db

结合图来描述以下:img

组合模式的类图以下:

了解完组合模式的种种,在下次的推文中,咱们将用于实际操做。咱们利用组合模式设计菜单,而且使用菜单,以此来巩固加深。敬请期待吧。

爱生活,爱学习,爱感悟,爱挨踢

相关文章
相关标签/搜索