正确使用复合图案

时间:2015-01-14 13:29:47

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

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

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

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

enter image description here

我不确定这是不对的。我得到的关于班级图的两个主要问题是:

  1. 使用值是正确的,对于复合材料来说是第一个/第二个,因为它们只有1个或2个术语,或者我应该用add方法制作一个列表并确保正好有1/2列表中的项目?
  2. 我应该为复合结构创建另一个界面(Sin,Divide,Subtract)
  3. 我做得对,还是我遵循了错误/错误的做法?

    谢谢

    贝恩德

2 个答案:

答案 0 :(得分:2)

复合模式实际上对如何表示复合节点的子节点没有任何限制。在您的情况下,您可以使用表示一元和二元操作的类,也可以为每个操作分别创建类。

第二个选项看起来像:

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。在这种情况下,操作枚举将包含实际的计算逻辑。除非你有大量的操作,否则我认为这对你的需求来说是不必要的复杂。

答案 1 :(得分:0)

对不起,但这不是复合模式的正确实现。如果你看一下,你会发现你没有Composite(带有add,remove和getChild方法的对象)类,并且你正在聚合你不应该做的Leaf对象。

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

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

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