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

我已经实现了带有复合类和叶类的复合模式。复合类包含其子对象(可能是叶类型或复合类型)的 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;

        }



    }


Qyouu
浏览 39回答 1
1回答

慕标琳琳

如果是组件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或枚举类型来区分它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java