为了账号安全,请及时绑定邮箱和手机立即绑定

实现复合模式的递归函数?

实现复合模式的递归函数?

Qyouu 2024-01-25 21:54:44
我已经实现了带有复合类和叶类的复合模式。复合类包含其子对象(可能是叶类型或复合类型)的 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或枚举类型来区分它们。


查看完整回答
反对 回复 2024-01-25
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信