我已经实现了带有复合类和叶类的复合模式。复合类包含其子对象(可能是叶类型或复合类型)的 ArrayList。每个类,无论是叶类还是复合类,都有一个名为“satisfied”的布尔变量。我的复合类可以是“和”类,也可以是“或”类 - 如果它是“和”类,则它需要其所有子级都满足才能满足。如果它是一个“或”类,则它需要至少有一个子级满足才能满足。我在为复合类编写递归函数“isSatisfied”来检查其所有子级是否都满足时遇到问题,因此它也会满足。它是递归的,因为如果复合对象具有复合的子对象,它也需要检查其所有子对象等。这是我尝试过的(这是不正确的)。任何帮助,将不胜感激。public boolean isSatisfied(Component g) { if (type.equals('and')) { for (Component i : ((Composite) g).getChildren()) { if (i instanceof Composite) { //it's a composite isSatisfied(i); } else { //it's a leaf if (i.satisfied() == true) { return true; } else { return false; } } } return false; } else if (type.equals('or')) { for (Component i : ((Composite) g).getChildren()) { if (i instanceof Composite) { isSatsified(i); } else { if (i.satisfied() == true) { return true; } } } return false; } }
1 回答
慕标琳琳
TA贡献1830条经验 获得超9个赞
如果是组件satistifed()的属性(模式中的根类型),则应在接口中声明该属性:
public interface Component {
boolean isSatisfied();
}
然后,由于调用子组件上的方法而发生递归:
public boolean isSatisfied() {
if( type.equals("and")) {
for( Component component : components ) {
if( !component.isSatisfied() ) {
return false;
}
}
return true;
}
}
(如果给定component的一个循环迭代恰好是复合的,则将再次调用相同的方法,因此,递归)。
当我们这样做时,还可以通过避免使用字符串作为布尔标记(其中 的部分type.equals("and"))来改进设计。如果给定的复合对象在运行时不会在 AND 类型和 OR 类型之间变化,请考虑使用单独的AndCompositeandOrComposite类。如果出于某种原因您希望复合材料在运行时更改其行为,那么我将使用 aboolean或枚举类型来区分它们。
添加回答
举报
0/150
提交
取消