缠丝猫 发表于 2024-9-18 19:57:55

设计模式 组合模式(Composite Pattern)

组合模式简绍

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的条理结构。组合模式使得客户端可以用一致的方式处置惩罚单个对象和组合对象。如许,可以在不知道对象详细类型的条件下操作对象聚集。
组合模式主要包罗三种角色:



[*]Component(组件):声明一个接口,在适当情况下,此接口被叶节点和容器节点共享。
[*]Leaf(叶节点):定义终端对象。
[*]Composite(容器节点):定义具有子部件的那些部件的举动。存储子部件。 组合模式的应用场景
组合模式的优缺点

组合模式的优点



[*]一致性:客户端可以一致地处置惩罚单个对象和组合对象。
[*]灵活性:可以很容易地添加新的叶子节点或组合节点。
[*]透明性:客户端不须要知道对象的详细类型就可以操作对象。
组合模式的缺点



[*]复杂性:对于简朴操作,组合模式大概会引入不须要的复杂性。
[*]额外开销:组合模式大概会导致额外的内存和 CPU 开销,尤其是在处置惩罚大量对象时
UML图

https://i-blog.csdnimg.cn/direct/247b5ccefa084c2eaee75d007bf5e639.png
定义一个公共接口或抽象类,它声明了全部叶子节点和容器节点共有的操作。
package CompositePatternModel;

public interface Component {

    void test();

    Component getChild(int i);

    public void operation();

    public void add(Component component);
}

实现 Component 接口中定义的操作,但不关心其他与子节点相关的操作。
package CompositePatternModel;

import java.util.ArrayList;
import java.util.List;

public class Composite implements Component{
    private String name;
    private List<Component> children = new ArrayList<>();

    public Composite(String name){
      this.name = name;
    }

    @Override
    public void test() {

    }

    @Override
    public Component getChild(int i) {
      return children.get(i);
    }

    @Override
    public void operation() {
      System.out.println("Composite " + name + " operation");
      for (Component c : children) {
            c.operation();
      }
    }

    @Override
    public void add(Component component) {
      children.add(component);
    }


}

实现 Component 接口中定义的操作,并且实现与子节点相关的操作。客户端可以一致地对待单个对象和组合对象。
package CompositePatternModel;

public class Pattern implementsComponent{
    private String name;

    public Pattern(String name){
      this.name = name;
    }

    @Override
    public void test() {
      System.out.println("test");
    }

    @Override
    public Component getChild(int i) {
      System.out.println("getChild");
      return null;
    }

    @Override
    public void operation() {
      System.out.println("operation: d" + name);
    }

    @Override
    public void add(Component component) {
      System.out.println("sdf"+ component);
    }

}

客户端可以一致地对待单个对象和组合对象。
package CompositePatternModel;

public class Main {
    public static void main(String[] args) {
      Pattern pattern = new Pattern("pattern1");
      Pattern pattern1 = new Pattern("pattern2");

      Composite composite = new Composite("Comp");
      composite.add(pattern);
      composite.add(pattern1);
      composite.operation();
    }
}


[*] 表示部分-整体条理结构
当你须要表示一个具有条理结构的对象集适时,组合模式黑白常有效的。这种结构通常包罗多个条理,每个条理上的对象可以是一个独立的实体(叶节点),也可以是一个包罗其他对象的容器(组合节点)。
示例:

[*]文件体系中的目次和文件:目次可以包罗其他目次和文件。
[*]组织结构图:部分可以包罗其他部分或员工。
[*]UI控件:一个复合控件可以包罗其他控件(如面板包罗按钮、文本框等)

[*] 透明地处置惩罚单个对象和组合对象
当客户端代码须要以一致的方式处置惩罚单个对象和组合对象时,组合模式可以让客户端无需关心处置惩罚的是单个对象照旧组合对象。
示例:

[*]图形编辑器:图形可以是单独的线条、矩形等基本图形,也可以是由多个基本图形组成的复合图形。
[*]渲染引擎:渲染对象可以是单一的几何体,也可以是由多个几何体组成的复杂场景。

[*] 动态地增删对象
当须要在运行时动态地添加或移除对象,并且这些对象大概是单个实体也大概是包罗其他对象的容器时,组合模式可以很好地支持这种需求。
示例:
游戏中的场景管理:游戏场景可以包罗单个游戏对象,也可以包罗其他场景。
UI 界面构建:一个窗口可以包罗多个面板,每个面板又可以包罗多个组件。
[*] 须要递归处置惩罚的对象聚集
当须要对一个条理结构举行递归处置惩罚时,组合模式可以简化递归逻辑。
示例:

[*]企业组织结构的遍历:遍历整个公司的部分和员工。
[*]文件体系的遍历:递归地遍历目次和文件。

[*] 须要一致的接口
当希望在差别类型的对象之间提供一致的接口时,组合模式可以确保全部的对象(无论是叶子照旧组合节点)都遵循相同的接口定义。
示例:
操作体系中的文件和目次:文件和目次都须要支持读写、删除等操作。
网页中的 DOM 结构:DOM 节点可以是文本节点也可以是包罗其他节点的元素节点。
组合模式提供了一种优雅的方式来组织和操作条理结构中的对象,使得客户端可以在不知道对象详细类型的情况下操作对象聚集。这种模式在许多领域都有广泛的应用,特别是在须要表示条理关系的场景中。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 设计模式 组合模式(Composite Pattern)