You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java组合模式display方法前缀递增异常问题求助

解决组合模式中目录层级前缀翻倍的问题

核心问题分析

问题出在Directory类的display方法递归传递前缀的逻辑上:你用了prefix + prefix作为子组件的前缀参数,这会让每一层前缀长度直接翻倍(比如从"+"变成"++",再变成"++++"),而非预期的每深入一层新增一个"+"。

解决方案

1. 修正前缀传递逻辑

修改Directory类的display方法,将传递给子组件的前缀改为prefix + "+",这样每深入一层就会在原有前缀基础上追加一个"+",实现层级递增的效果。

修正后的display方法代码:

@Override
public String display(String prefix) {
    String totalString = name + ": (count=" + getCount() + ", size=" + getSize() + ")" + System.lineSeparator();

    for (Component component : children) {
        // 替换prefix+prefix为prefix+"+",保证前缀逐层级递增
        totalString = totalString + prefix + component.display(prefix + "+");
    }
    return totalString;
}

2. 清理冗余代码

Directory类中的static int count是无效冗余代码,getCount方法已经通过局部变量统计子组件数量,直接删除该静态变量即可。

3. 修复search方法的逻辑漏洞

原search方法找到匹配项时返回的是父目录而非目标组件,修正后返回实际匹配的组件:

@Override
public Component search(String name) {
    // 先检查当前目录是否匹配
    if (this.name.equals(name)) {
        return this;
    }
    for(Component component: children) {
        Component found = component.search(name);
        if (found != null) {
            return found;
        }
    }
    return null;
}

修正后的输出

运行测试类后,输出将完全符合预期:

pictures: (count=2, size=622)
+personal: (count=2, size=622)
++family-holiday (201)
++misc: (count=1, size=421)
+++dog: (count=1, size=421)
++++wallpaper (421)

补充说明

  • File类的display方法无需修改,前缀由父目录在拼接时添加,保持叶子节点的简洁性符合组合模式的设计思路。
  • 这种前缀传递方式是组合模式中展示树形层级的常规手段,通过递归时传递递增的前缀,实现清晰的结构展示。

内容的提问来源于stack exchange,提问作者Tlmua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:50:19