小威要向诸佬学习呀

小威要向诸佬学习呀

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的组合模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
23种设计模式之组合模式(Composite Pattern)-LMLPHP

以下正文开始
23种设计模式之组合模式(Composite Pattern)-LMLPHP

组合模式概念

组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示**“部分-整体”**的层次结构。组合模式允许客户端使用一致的方式处理单个对象和对象组合,使得系统中的对象可以任意组合,从而简化了代码的处理流程。

组合模式的核心在于抽象出“容器”类和“叶子”类之间的公共接口,并且用容器类来组合多个“叶子”或“容器”,从而构建出具有层级关系的对象结构。同时,“容器”类还需要实现管理其中子对象的方法,如增加、移除、遍历等。

组合模式包含以下几个角色:

  • Component(抽象构件):定义组合模式中所有对象的通用接口,可以实现一些默认行为。
  • Leaf(叶子结点):表示组合中的具体对象,也是层级结构的最细粒度,没有子类。
  • Composite(容器结点):表示包含子节点的复杂对象,通常会持有一个或多个Component对象的集合。

组合模式优缺点

下面是组合模式的主要优点:

  1. “整体/部分”关系清晰:可以用树形结构表示部分和整体之间的关系,便于理解。
  2. 节点自由增加:由于使用了组合模式,我们可以很方便地增加节点或者更改节点属性而不必修改现有代码
  3. 简化客户端代码:客户端可以忽略对象组合与单个对象之间的差异,从而简化了客户端代码。

当然,组合模式也有局限性:

  1. 可能会导致系统过度一般化,因此在使用时要慎重考虑。
  2. 可能导致设计变得更加复杂,限制了具体节点行为的实现。

组合模式适用场景

  • 当需要表示对象的部分-整体层次结构时,可以使用组合模式。
  • 当希望客户端能够忽略组合对象与单个对象之间的差异时,可以使用组合模式。
  • 当需要对组合对象进行操作,无需关心是单个对象还是组合对象时,可以使用组合模式。

组合模式代码案例

以下是一个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种设计模式之其他模式,感谢大佬认真读完支持咯~
23种设计模式之组合模式(Composite Pattern)-LMLPHP

23种设计模式之组合模式(Composite Pattern)-LMLPHP

05-18 22:57