Java 复合图案的正确使用
我目前正在修一门软件工程课程(我必须修)。 我们有一大堆任务需要我们在Java中使用设计模式。通常我只是一个PHP开发人员,所以我在Java方面没有很多技能,这可能是个问题 具体问题是:我们必须使用复合模式来解决以下问题:创建数学框架来解决术语。术语可以是连接两个术语的数字(双精度)或“/”、“-”或使用一个术语的“sin” 我必须创建一个UML类图来实现。 这是哪一个 我不确定这是否正确。关于我的类图,我有两个主要问题:Java 复合图案的正确使用,java,design-patterns,uml,class-diagram,composite,Java,Design Patterns,Uml,Class Diagram,Composite,我目前正在修一门软件工程课程(我必须修)。 我们有一大堆任务需要我们在Java中使用设计模式。通常我只是一个PHP开发人员,所以我在Java方面没有很多技能,这可能是个问题 具体问题是:我们必须使用复合模式来解决以下问题:创建数学框架来解决术语。术语可以是连接两个术语的数字(双精度)或“/”、“-”或使用一个术语的“sin” 我必须创建一个UML类图来实现。 这是哪一个 我不确定这是否正确。关于我的类图,我有两个主要问题: 对于组合,使用value和first/second是否正确,因为它们只
add
方法制作一个列表,并确保列表中正好有1/2个项目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中的实现非常相似。所以我的图表代表了复合模式的正确用法?是的。但请注意,这个术语需要是一个接口或抽象类。看起来你们已经意识到,在你们建模的过程中,术语是一个界面。非常感谢。