我已經實現了帶有復合類和葉類的復合模式。復合類包含其子對象(可能是葉類型或復合類型)的 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
提交
取消