欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-08 20:08:27
现在我们已经能愉快地看着一页一页罗列出来的菜单进行点菜了。现在又有的小伙伴希望能够加上一份餐后甜点的“子菜单”。怎么办呢?我们不仅仅要支持多个菜单,甚至还要支持菜单中的菜单。 如果我们能让甜点菜单变成餐厅菜单集合的一个元素,那该有多好。但是根据现在的实现,根本做不到呀。我们想要的是这样的: 我们需要 ......

现在我们已经能愉快地看着一页一页罗列出来的菜单进行点菜了。现在又有的小伙伴希望能够加上一份餐后甜点的“子菜单”。怎么办呢?我们不仅仅要支持多个菜单,甚至还要支持菜单中的菜单。

如果我们能让甜点菜单变成餐厅菜单集合的一个元素,那该有多好。但是根据现在的实现,根本做不到呀。我们想要的是这样的:

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

我们需要什么

现在我们遇到的现实问题是,我们的系统已经达到了一个复杂的级别,如果现在不重新设计,就无法容纳未来增加的菜单或子菜单等需求。

所以,在我们的新设计中,真正需要些什么呢?

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

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

定义组合模式

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

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

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

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

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

结合图来描述如下:

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

组合模式的类图如下:

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

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

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

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