使用Composite Pattern来计算世界上的人数

时间:2018-01-09 17:33:03

标签: design-patterns uml diagram composite

我正在尝试制作一个复合模式来计算世界,大陆,国家的人数...对不起没有州,但是国家我很抱歉

以下是我遵循的模式:enter image description here

我这样做了:

enter image description here

但我不确定这是对的,因为我可以使用leaf -> population吗?

因为当我为PC做复合模式时它(PC = PC的组件将是Cabinet =复合,从Cabinet将是HDD = leaf和主板=复合,从主板将是RAM = leaf和CPU = leaf)。我想说的每个叶子都不同,在我的图表中是相同的。

你认为我至少有一些好的东西。

感谢您的回答:)

2 个答案:

答案 0 :(得分:1)

首先,您应该首先分析您的问题。那么你有什么,它是如何相关的。所以你有一个世界 大陆,其中每个大陆包含 国家,每个国家/地区包含地区 。在进行这样的面向对象分析时,名词(这里标有粗体)是您班级的候选人。并且关系术语给出了一些关于类如何相关的指示(标记为斜体)。

那么我们能看到什么呢?有些术语(称为实体)具有一些直接排序的分层包含关系。但是,某种东西可以被看作是另一种类型的元素。在考虑如何相互继承时,这是一个重要的信息;因为继承关系可以看作是一种专业化,它在这里没有任何意义:一个国家不是一个特定的世界,一个世界不是一个特定的国家。此外,我们看到没有旁路,例如一个国家不是世界的直接组成部分。并且没有元素可以包含其自身类型的元素,例如没有国家/地区包含国家/地区。

enter image description here

那么我们可以从这个简短的分析中学到什么呢?我们不能将问题表述为复合而不改变显着的表达性(例如,改变预期的层次结构)或不引入太多额外的复杂性(例如通过约束)。

现在在第二步中,我们根据分析结果开发设计。设计在最后的样子取决于元素应该做什么。

  1. 解决方案:在您的示例中,您只需向任何类添加calculatePopulation操作即可。由于任何类都知道它的部分及其类型,因此可以通过调用下一个元素类型的包含实例的calculatePopulation操作来直接完成。这将是解决此类问题的OO方式,如果没有进一步的约束,这很可能是最好的方法。
  2. enter image description here

    要启动它,你只需调用你的wold实例的calculatePopulation。

    如果要以统一的方式处理任何类型的元素,可以创建一个抽象类或接口,让所有元素从中继承/实现它。此类/接口声明calculatePopulation操作。如果改进了解决方案,您可以从层次结构中的任意元素开始计算总体数,而不用考虑它是什么类型的元素。

    1. 解决方案:当您想要一个未在类层次结构中实现并且是递归的算法时。在这种情况下,您需要一个抽象,这样您就可以以相同的方式处理所有元素,因为算法实现不应该处理太多细节。因此,也让所有元素都从一个abstact类继承,该类具有提供包含元素的操作和提供填充的操作,该操作直接是元素的一部分(不像之前的情况那样是传递/间接的)。所以现在你会遇到这样的情况,即你有两个明显的disticitve案例,首先你有子元素,没有直接人口,第二,你没有子元素和直接人口。但是你的遍历可以忽略这一点。
    2. enter image description here

      在这里,您可以通过调用您的实现(这是另一个类)并传递您想要拥有的对象来启动它。

      当然还有其他解决方案。但是所有那些仅仅针对这个问题使用复合的人都是非常人为的,因为它的概念是递归的,你的问题不是递归的(即没有元素可以包含相同类型的元素),因此复合材料是无法辨认的或者叫它超大。

答案 1 :(得分:-2)

至少你不需要拥有世界,大陆,州,地区。

只需要具有属性类型的Composite即可知道这是一个大陆,还是一个州或一个地区。

国家应该是叶无?

像文件树一样思考:未定义级别数,模式支持任何深度编号。

On State你得到一个方法getPopulation,它也在Component中定义为abstract,在Composite中定义为return -1或infinite(值表示未实现)。

对我来说,叶子和组件上也需要方法getChild。没有它,就不可能实现递归算法来导航复合。

在叶子上,它返回一个空列表:这是知道到达叶子的方法。

enter image description here

PS:我离开聚合因为它在你的第一个图表中使用,如果我这样做,我将使用一个简单的关联或组合而不是聚合。