Java 复合图案的正确使用

Java 复合图案的正确使用,java,design-patterns,uml,class-diagram,composite,Java,Design Patterns,Uml,Class Diagram,Composite,我目前正在修一门软件工程课程(我必须修)。 我们有一大堆任务需要我们在Java中使用设计模式。通常我只是一个PHP开发人员,所以我在Java方面没有很多技能,这可能是个问题 具体问题是:我们必须使用复合模式来解决以下问题:创建数学框架来解决术语。术语可以是连接两个术语的数字(双精度)或“/”、“-”或使用一个术语的“sin” 我必须创建一个UML类图来实现。 这是哪一个 我不确定这是否正确。关于我的类图,我有两个主要问题: 对于组合,使用value和first/second是否正确,因为它们只

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

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

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

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

  • 对于组合,使用value和first/second是否正确,因为它们只有1个或2个术语,或者我应该使用
    add
    方法制作一个列表,并确保列表中正好有1/2个项目
  • 我是否应该为复合结构创建另一个接口(Sin、Divide、Subtract)
  • 我的做法是对的,还是错误的

    多谢各位


    Bernd

    复合模式实际上对如何表示复合节点的子节点没有任何限制。在您的例子中,您可以拥有表示一元和二元操作的类,或者为每个操作拥有单独的类

    第二个选项类似于:

    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最接近的表示形式。在这种情况下,将子术语建模为
    列表没有任何好处


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

    对不起,这不是复合模式的正确实现。如果您查看它,您将看到您没有Composite(包含add、remove和getChild方法的对象)类,并且您正在聚合不应该这样做的叶对象

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

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


    请记住,组合的solve()方法需要将一个叶对象作为参数,这会告诉它需要调用哪个子solve()方法。

    请注意,设计模式不仅仅链接到Java。事实上,GOF使用C++语言来说明他们的例子。设计模式与语言无关。谢谢,我已经知道了。但在这门课程中,我们必须使用JavaIt,这对我来说很好。可以使用first/second。如果有更多操作,可以添加基类BinaryOperation和UnaryOperation。我会把这个词换成表达。对我来说,这个术语应该是一个终端符号()。这与我在Java中的实现非常相似。所以我的图表代表了复合模式的正确用法?是的。但请注意,这个术语需要是一个接口或抽象类。看起来你们已经意识到,在你们建模的过程中,术语是一个界面。非常感谢。