【问题标题】:Correct usage of composite pattern复合图案的正确使用
【发布时间】:2015-01-14 13:29:46
【问题描述】:

我目前正在学习软件工程课程(我必须)。 我们有一大堆任务需要我们在 Java 中使用设计模式。通常我只是一个PHP开发人员,所以我没有太多Java技能,这可能是个问题。

具体问题是:我们必须使用复合模式来解决以下问题:创建一个数学框架来解决术语。该术语可以是连接两个术语的数字(双)或“/”、“-”,或使用一个术语的“sin”。

我必须创建一个 UML 类图。 这是哪个

我不确定这是否正确。我得到的关于类图的两个主要问题是:

  1. 使用 value 和 first/second 用于 Composites 是否正确,因为它们只有 1 或 2 个术语,或者我应该使用 addmethod 列出一个列表并确保其中正好有 1/2 项清单?
  2. 我是否应该为复合结构创建另一个接口(Sin、Divide、Subtract)

我做对了吗,还是我遵循了错误/错误的方法?

谢谢

伯纳德

【问题讨论】:

  • 请注意设计模式不仅仅与 Java 相关联。实际上,GoF 使用 C++ 语言来说明他们的示例。设计模式与语言无关。
  • 谢谢,我已经知道了。但是在这个课程中我们必须使用Java
  • 对我来说看起来不错。可以使用第一个/第二个。如果您有更多操作,您可以添加基类 BinaryOperation 和 UnaryOperation。我只是将术语更改为表达式。对我来说 Term 应该是一个终结符号 (en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols)。

标签: java design-patterns uml class-diagram composite


【解决方案1】:

复合模式实际上并没有对您表示复合节点的子节点的方式施加任何限制。在您的情况下,您可以拥有表示一元和二元操作的类,也可以为每个操作设置单独的类。

第二个选项看起来像:

interface Term {
    double getValue();
}

class Constant implements Term {
    private double value;
    public double getValue() {
        return value;
    }
}

class Divide implements Term {
    private Term numerator;
    private Term denominator;
    public double getValue() {
        return numerator.getValue() / denominator.getValue();
    }
}

这可能是最接近您的 UML 的表示。在这种情况下,将子术语建模为 List 没有任何优势。

我提到的另一个选项(我不推荐)是拥有UnaryOperationBinaryOperation 类,然后为操作定义和enum。在这种情况下,操作枚举将包含实际的计算逻辑。我认为这对于您的需求来说是不必要的复杂,除非您有大量的操作。

【讨论】:

  • 这就是我在 Java 中实现的样子。所以我的图代表了复合模式的正确用法?
  • 是的。尽管请注意 Term 需要是接口或抽象类。看起来您在建模时意识到了这一点。
  • 是的,term 是一个接口。谢谢
【解决方案2】:

抱歉,这不是复合模式的正确实现。如果您查看它,您会发现您没有 Composite(具有 add、remove 和 getChild 方法的对象)类,并且您正在聚合不应该做的 Leaf 对象。

如果您要将复合模式应用于此问题,您需要提出一个包含要执行的不同操作的类。

所以,首先创建一个类似于FrameworkItem 的抽象类。这对应于复合模式图上的 Component。由此,派生出另一个名为 Term 的类。这是您的组合,并且是 FrameworkItem 的聚合。 (确保它包含您的 add、remove 和 getChild 方法。)最后,也使用简单的关联而不是使用简单的关联从 FrameworkItem 中单独派生出您的 Leaf 类(Number、Sin、Subtract、Divide 等)聚合。

请记住,您的 Composite 的solve() 方法需要一个Leaf 对象作为参数,它告诉它它需要调用它的哪个子级solve() 方法。

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2017-11-15
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多