我正在尝试制作一个复合模式来计算世界,大陆,国家的人数...对不起没有州,但是国家我很抱歉
我这样做了:
但我不确定这是对的,因为我可以使用leaf -> population
吗?
因为当我为PC做复合模式时它(PC = PC的组件将是Cabinet =复合,从Cabinet将是HDD = leaf和主板=复合,从主板将是RAM = leaf和CPU = leaf)。我想说的每个叶子都不同,在我的图表中是相同的。
你认为我至少有一些好的东西。
感谢您的回答:)
答案 0 :(得分:1)
首先,您应该首先分析您的问题。那么你有什么,它是如何相关的。所以你有一个世界 大陆,其中每个大陆包含 国家,每个国家/地区包含地区 。在进行这样的面向对象分析时,名词(这里标有粗体)是您班级的候选人。并且关系术语给出了一些关于类如何相关的指示(标记为斜体)。
那么我们能看到什么呢?有些术语(称为实体)具有一些直接排序的分层包含关系。但是,某种东西可以被看作是另一种类型的元素。在考虑如何相互继承时,这是一个重要的信息;因为继承关系可以看作是一种专业化,它在这里没有任何意义:一个国家不是一个特定的世界,一个世界不是一个特定的国家。此外,我们看到没有旁路,例如一个国家不是世界的直接组成部分。并且没有元素可以包含其自身类型的元素,例如没有国家/地区包含国家/地区。
那么我们可以从这个简短的分析中学到什么呢?我们不能将问题表述为复合而不改变显着的表达性(例如,改变预期的层次结构)或不引入太多额外的复杂性(例如通过约束)。
现在在第二步中,我们根据分析结果开发设计。设计在最后的样子取决于元素应该做什么。
要启动它,你只需调用你的wold实例的calculatePopulation。
如果要以统一的方式处理任何类型的元素,可以创建一个抽象类或接口,让所有元素从中继承/实现它。此类/接口声明calculatePopulation操作。如果改进了解决方案,您可以从层次结构中的任意元素开始计算总体数,而不用考虑它是什么类型的元素。
在这里,您可以通过调用您的实现(这是另一个类)并传递您想要拥有的对象来启动它。
当然还有其他解决方案。但是所有那些仅仅针对这个问题使用复合的人都是非常人为的,因为它的概念是递归的,你的问题不是递归的(即没有元素可以包含相同类型的元素),因此复合材料是无法辨认的或者叫它超大。
答案 1 :(得分:-2)
至少你不需要拥有世界,大陆,州,地区。
只需要具有属性类型的Composite即可知道这是一个大陆,还是一个州或一个地区。
国家应该是叶无?
像文件树一样思考:未定义级别数,模式支持任何深度编号。
On State你得到一个方法getPopulation,它也在Component中定义为abstract,在Composite中定义为return -1或infinite(值表示未实现)。
对我来说,叶子和组件上也需要方法getChild。没有它,就不可能实现递归算法来导航复合。
在叶子上,它返回一个空列表:这是知道到达叶子的方法。
PS:我离开聚合因为它在你的第一个图表中使用,如果我这样做,我将使用一个简单的关联或组合而不是聚合。