您现在的位置是:首页 >其他 >组合设计模式网站首页其他

组合设计模式

running_1997 2024-06-14 17:17:16
简介组合设计模式

组合模式定义

将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

使用场景

以下是一些组合模式在生活中的案例:

1、文件系统的目录结构:

文件系统中的目录结构可以看作是一个树形结构,每个目录可以包含文件和子目录。这个例子中,目录就是复合对象,而文件就是单个对象。

2、组织架构图:

组织架构图也可以看作是一个树形结构,每个部门可以包括多个员工和子部门。这个例子中,部门就是复合对象,而员工就是单个对象。

3、菜单和菜单项:

在餐厅中,菜单可以包含多个菜单项,而每个菜单项可以是单个菜品或者是一个子菜单。这个例子中,菜单就是复合对象,而菜单项就是单个对象。

4、使用场景总结:

  1. 维护和展示部分-整体关系的场景
  2. 如树形菜单、文件和文件夹管理从一个整体中能够独立出部分模块或功能的场景。
  3. 只要是树形结构,就考虑使用组合模式

角色定义

Component 抽象构件角色:

 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性.

Leaf 叶子构件:

叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。

Composite 树枝构件:

树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构

需求背景

使用组合模式实现对文件和文件夹的管理

使用组合模式实现对文件和文件夹的管理

代码实现

Component(抽象构件角色)

public abstract class Component {
    protected String name;

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

    public abstract void add(Component c);
    public abstract void remove(Component c);
    public abstract void display(int depth);
}

Leaf(叶子构件)

public class File extends Component {
    public File(String name) {
        super(name);
    }

    public void add(Component c) {
        System.out.println("不能添加文件到文件");
    }

    public void remove(Component c) {
        System.out.println("不能从文件中删除文件");
    }

    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);
    }
}

Composite(树枝构件)

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

public class Folder extends Component {
    private List<Component> children;

    public Folder(String name) {
        super(name);
        children = new ArrayList<>();
    }

    public void add(Component c) {
        children.add(c);
    }

    public void remove(Component c) {
        children.remove(c);
    }

    public void display(int depth) {
        for (int i = 0; i < depth; i++) {
            System.out.print("-");
        }
        System.out.println(name);

        for (Component c : children) {
            c.display(depth + 2);
        }
    }
}

测试案例

public class Test {
    public static void main(String[] args) {
        Component root = new Folder("C:");
        Component folder1 = new Folder("Program Files");
        Component folder2 = new Folder("Users");
        Component file1 = new File("readme.txt");
        Component file2 = new File("program.exe");

        root.add(folder1);
        root.add(folder2);
        folder1.add(file2);
        folder2.add(file1);

        root.display(0);
    }
}

输出结果

C:
  -Program Files
    --program.exe
  -Users
    --readme.txt

案例总结

  1. 组合模式可以很好地管理树形结构,它将复杂的结构分解成了一个个简单的对象,从而使得代码更加简洁和易于维护。
  2. 在实现过程中,我们需要定义抽象构件角色、叶子构件和树枝构件,其中叶子构件表示最基本的对象,而树枝构件表示复合对象。
  3. 在客户端中,我们可以通过组合叶子和树枝构件来构建复杂的结构,并且可以通过抽象构件角色来实现对所有对象的统一管理。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。