1、概念
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性,属于结构性模式。
2、模式结构
- Component:组合中的对象声明接口,实现所有类共有接口的默认行为,声明一个接口用于访问和管理Component子部件
- Leaf:叶子对象,叶子结点没有子结点
- Composite:容器对象,定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作
3、使用场景
- 表示对象的部分-整体层次结构
- 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节
4、优缺点
优点:
- 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易
- 客户端调用简单,客户端可以一致的使用组合结构或其中单个对象
- 更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码
缺点:
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则
- 使设计变得更加抽象
5、实例
public abstract class File {
private String name;
public File(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void display();
}
public class Folder extends File {
private List<File> files;
public Folder(String name) {
super(name);
files = new ArrayList<>();
}
@Override
public void display() {
for (File file : files) {
file.display();
}
}
public void add(File file) {
files.add(file);
}
public void remove(File file){
files.remove(file);
}
}
public class ImageFile extends File {
public ImageFile(String name) {
super(name);
}
@Override
public void display() {
// image的业务逻辑
}
}
public class TextFile extends File {
public TextFile(String name) {
super(name);
}
@Override
public void display() {
// text的业务逻辑
}
}