如今咱们已经能愉快地看着一页一页罗列出来的菜单进行点菜了。如今又有的小伙伴但愿可以加上一份餐后甜点的“子菜单”。怎么办呢?咱们不单单要支持多个菜单,甚至还要支持菜单中的菜单。学习
若是咱们能让甜点菜单变成餐厅菜单集合的一个元素,那该有多好。可是根据如今的实现,根本作不到呀。咱们想要的是这样的:设计
如今咱们遇到的现实问题是,咱们的系统已经达到了一个复杂的级别,若是如今不从新设计,就没法容纳将来增长的菜单或子菜单等需求。3d
因此,在咱们的新设计中,真正须要些什么呢?对象
没错,咱们要介绍另外一个模式解决这个难题。咱们并无放弃迭代器--它仍然是咱们解决方案中的一部分--然而,管理菜单的问题已经到了一个迭代器没法解决的新维度。因此,咱们将倒退几步,改用组合模式来实现。blog
组合模式:容许你将对象组合成树形结构来表现“总体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。遍历
让咱们以菜单为例思考这一切:这个模式可以建立一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。经过将菜单和项放在相同的结构中,咱们建立了一个“总体/部分”层次结构,即由菜单和菜单项组成的对象树。可是能够将它视为一个总体,像是一个丰富的大菜单。迭代器
一旦有了丰富的大彩蛋,咱们就可使用这个模式来“统一处理个别对象和组合对象”。这意味着什么?它意味着,若是咱们有了一个树形结构的菜单、子菜单和可能还带有菜单项的子菜单,那么任何一个菜单都是一种“组合”。im
由于它既能够包含其余菜单,也能够包含菜单项。个别对象只是菜单项--并未持有其余对象。就像你将看到,使用一个遵守组合模式的设计,让咱们可以写出简单的代码,就可以对整个菜单结构应用相同的操做。db
结合图来描述以下:img
组合模式的类图以下:
了解完组合模式的种种,在下次的推文中,咱们将用于实际操做。咱们利用组合模式设计菜单,而且使用菜单,以此来巩固加深。敬请期待吧。