您现在的位置是:首页 >其他 >组合设计模式网站首页其他
组合设计模式
简介组合设计模式
组合模式
组合模式定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
使用场景
以下是一些组合模式在生活中的案例:
1、文件系统的目录结构:
文件系统中的目录结构可以看作是一个树形结构,每个目录可以包含文件和子目录。这个例子中,目录就是复合对象,而文件就是单个对象。
2、组织架构图:
组织架构图也可以看作是一个树形结构,每个部门可以包括多个员工和子部门。这个例子中,部门就是复合对象,而员工就是单个对象。
3、菜单和菜单项:
在餐厅中,菜单可以包含多个菜单项,而每个菜单项可以是单个菜品或者是一个子菜单。这个例子中,菜单就是复合对象,而菜单项就是单个对象。
4、使用场景总结:
- 维护和展示部分-整体关系的场景
- 如树形菜单、文件和文件夹管理从一个整体中能够独立出部分模块或功能的场景。
- 只要是树形结构,就考虑使用组合模式
角色定义
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
案例总结
- 组合模式可以很好地管理树形结构,它将复杂的结构分解成了一个个简单的对象,从而使得代码更加简洁和易于维护。
- 在实现过程中,我们需要定义抽象构件角色、叶子构件和树枝构件,其中叶子构件表示最基本的对象,而树枝构件表示复合对象。
- 在客户端中,我们可以通过组合叶子和树枝构件来构建复杂的结构,并且可以通过抽象构件角色来实现对所有对象的统一管理。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。