我目前正在攻读软件工程课程(我必须)。 我们有很多任务要求我们在Java中使用设计模式。通常我只是一个PHP开发人员,所以我没有很多Java技能,这可能是个问题。
具体问题是:我们必须使用复合模式来解决以下问题:创建一个数学框架来解决术语。该术语可以是Number(double)或“/”,“ - ”连接两个术语,或“sin”使用一个Term。
我必须创建一个UML类图。 这是什么
我不确定这是不对的。我得到的关于班级图的两个主要问题是:
add
方法制作一个列表并确保正好有1/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
没有优势。
我提到的另一个选项(我不建议)是拥有UnaryOperation
和BinaryOperation
类,然后为操作定义和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()方法。