前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的组合模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
以下正文开始
文章目录
- 组合模式概念
- 组合模式优缺点
- 组合模式适用场景
- 组合模式代码案例
- 组合模式小结
组合模式概念
组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示**“部分-整体”**的层次结构。组合模式允许客户端使用一致的方式处理单个对象和对象组合,使得系统中的对象可以任意组合,从而简化了代码的处理流程。
组合模式的核心在于抽象出“容器”类和“叶子”类之间的公共接口,并且用容器类来组合多个“叶子”或“容器”,从而构建出具有层级关系的对象结构。同时,“容器”类还需要实现管理其中子对象的方法,如增加、移除、遍历等。
组合模式包含以下几个角色:
- Component(抽象构件):定义组合模式中所有对象的通用接口,可以实现一些默认行为。
- Leaf(叶子结点):表示组合中的具体对象,也是层级结构的最细粒度,没有子类。
- Composite(容器结点):表示包含子节点的复杂对象,通常会持有一个或多个Component对象的集合。
组合模式优缺点
下面是组合模式的主要优点:
- “整体/部分”关系清晰:可以用树形结构表示部分和整体之间的关系,便于理解。
- 节点自由增加:由于使用了组合模式,我们可以很方便地增加节点或者更改节点属性而不必修改现有代码。
- 简化客户端代码:客户端可以忽略对象组合与单个对象之间的差异,从而简化了客户端代码。
当然,组合模式也有局限性:
- 可能会导致系统过度一般化,因此在使用时要慎重考虑。
- 可能导致设计变得更加复杂,限制了具体节点行为的实现。
组合模式适用场景
- 当需要表示对象的部分-整体层次结构时,可以使用组合模式。
- 当希望客户端能够忽略组合对象与单个对象之间的差异时,可以使用组合模式。
- 当需要对组合对象进行操作,无需关心是单个对象还是组合对象时,可以使用组合模式。
组合模式代码案例
以下是一个Java代码示例:
// Component.java - 抽象构件
public interface Component {
void add(Component c);
void remove(Component c);
Component getChild(int index);
void operation();
}
// Leaf.java - 叶子结点
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void add(Component c) {
System.out.println("Cannot add to a leaf");
}
@Override
public void remove(Component c) {
System.out.println("Cannot remove from a leaf");
}
@Override
public Component getChild(int index) {
System.out.println("Cannot get child from a leaf");
return null;
}
@Override
public void operation() {
System.out.println("Leaf " + name + " is being operated");
}
}
// Composite.java - 容器结点
public class Composite implements Component {
private List<Component> children = new ArrayList<>();
@Override
public void add(Component c) {
children.add(c);
}
@Override
public void remove(Component c) {
children.remove(c);
}
@Override
public Component getChild(int index) {
return children.get(index);
}
@Override
public void operation() {
System.out.println("Composite is being operated");
for (Component c : children) {
c.operation();
}
}
}
在上面这个示例中,Component是抽象构件接口,定义了所有组合对象的通用方法。Leaf是叶子节点类,不持有其他子节点,只有自身特定行为的操作。Composite是容器节点类,持有多个叶子和容器节点,实现add、remove、getChild和operation等一系列操作。当客户端需要调用一个特定节点的操作时,只需要找到该节点并执行它的operation方法即可。
通过使用组合模式,我们可以方便地处理复杂的对象结构。例如,假设我们需要对一个多层嵌套的文件夹进行操作时,就可以使用组合模式将每个文件夹看作是容器节点,文件看作是叶子节点,并针对不同级别的文件夹进行相应的操作。这样一来,无论文件夹层级多少,我们都可以通过统一的方法来处理它们。
组合模式小结
组合模式适用于需要表示对象的部分-整体层次结构的场景,例如图形界面程序、文件系统等。它也适用于希望客户端能够忽略组合对象与单个对象之间的差异,以及需要对组合对象进行操作,无需关心是单个对象还是组合对象的场景。
使用组合模式,可以使系统更加灵活和易于扩展,但也会增加复杂度。因此,在使用组合模式时,应该根据实际情况进行选择,避免过度设计。
好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞