zoukankan      html  css  js  c++  java
  • 设计模式之迭代器与组合模式(三)

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

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

    我们需要什么

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

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

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

    定义组合模式

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

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

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

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

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

    结合图来描述如下:

    组合模式的类图如下:

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

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

  • 相关阅读:
    分页插件PageHelper
    持久层的具体实现
    SSM框架搭建
    mysql库中建立存储过程
    安装python2.7
    Spark应用程序第三方jar文件依赖解决方案
    spark2.0.1源码编译
    Hadoop2.7.3源码编译
    Hadoop2.x伪分布式环境搭建(一)
    Linux基础环境的各项配置(三)
  • 原文地址:https://www.cnblogs.com/dimple91/p/11068379.html
Copyright © 2011-2022 走看看