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
相关产品推荐
相关产品推荐

