什么是组合模式
(Composite:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
模式角色
组合部件(Component:组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
Leaf叶子(File):叶子对象,叶子结点没有子结点。
Composite合成部件(Folder):容器对象,定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
UML类图
![](https://img.haomeiwen.com/i10195209/32de29db6c6ac4af.png)
代码实现
梳理下定义,组合模式又叫部分-整体模式;将对象组合成树状的层次结构的模式。生活中公司/部门/分公司,文件夹/文件/文件夹/....这都是树状结构。代码中通过文件/文件夹来实现组合模式。
public interface Component {
void display();
void add(Component component);
void remove(Component component);
}
public class File implements Component {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void display() {
System.out.println("叶子节点,文件名:" + name);
}
@Override
public void add(Component component) {
}
@Override
public void remove(Component component) {
}
}
public class Folder implements Component {
// 组合模式的核心思想了。文件和文件夹是一种"部分-整体"的关系,文件夹里面既可以包含文件,
// 也可以包含文件夹,而包含的文件夹里面又可以包含文件和文件夹.....
private List<Component> list = new ArrayList<>();
private String name;
public Folder(String name) {
this.name = name;
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
list.remove(component);
}
@Override
public void display() {
System.out.println("文件夹名称:"+name);
for (Component component : list) {
component.display();
}
}
}
public class Client {
public static void main(String[] args) {
Folder folder = new Folder("design");
Folder folder2 = new Folder("composite");
folder.add(folder2);
File file = new File("Component.java");
File file2 = new File("File.java");
File file3 = new File("Folder.java");
folder.add(file);
folder.add(file2);
folder.add(file3);
folder.display();
}
}
文件夹名称:design
文件夹名称:composite
叶子节点,文件名:Component.java
叶子节点,文件名:File.java
叶子节点,文件名:Folder.java
优点
组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”
缺点
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;
组合模式完整代码
网友评论