在 Java 中使用**组合模式(Composite Pattern)**时,有几个关键点需要注意,既涉及设计原则,也涉及实际实现细节:
组合模式用于把对象组合成树形结构,以表示“部分-整体”的层次关系,让客户端可以统一对待单个对象和组合对象。
这是最重要的一点。
abstract class Component {
void add(Component c) {}
void remove(Component c) {}
void operation() {}
}
add/remove,容易误用abstract class Component {
void operation() {}
}
class Composite extends Component {
void add(Component c) {}
void remove(Component c) {}
}
✅ 建议:
例如:
void saveToDB();
如果叶子节点根本不需要,就不要放在抽象类中。
✅ 原则:
公共方法只放“所有节点都合理拥有”的行为
组合模式天然是递归结构:
void operation() {
for (Component c : children) {
c.operation();
}
}
⚠ 注意:
StackOverflowError✅ 解决:
常见问题:
✅ 建议:
public void add(Component child) {
children.add(child);
child.setParent(this); // 可选
}
如果业务需要:
那就需要:
private Component parent;
否则可以不维护。
如果组合结构会:
⚠ 要加锁或使用并发集合:
CopyOnWriteArrayList<Component>
当操作种类很多时:
interface Visitor {
void visit(Leaf l);
void visit(Composite c);
}
避免 Component 膨胀。
组合结构容易:
✅ 建议:
❌ 用组合模式只是“为了好看”
❌ 树结构很浅、变化少
❌ 叶子节点被迫实现无用方法
✅ 使用组合模式,如果:
❌ 不适合:
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。