一、背景
相信大家都熟悉我们的目录及文件结构,我们的目录里面可以存放目录和文件,每层目录都可以在其中创建目录或者文件,每层目录操作的方式都是一样的,使我们用起来更方便简洁。试想如果每层目录的操作方式不一样,那是得多麻烦。组合模式正是应对这样的问题。
二、概念
组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
三、代码实例
import java.util.ArrayList;
import java.util.List;
/**
* 抽象角色,为组合对象提供一个统一接口
*/
abstract class Component {
private 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();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 目录(支节点)
*
*/
class Catalog extends Component {
/**
* 用来存放子目录或者文件
*/
private List<Component> compList = new ArrayList<Component>();
public Catalog(String name) {
super(name);
}
@Override
public void add(Component c) {
this.compList.add(c);
}
@Override
public void remove(Component c) {
this.compList.remove(c);
}
@Override
public void display() {
System.out.print(this.getName() + ":");
for (int i = 0; i < compList.size(); i++) {
if (i < compList.size() - 1) {
System.out.print(compList.get(i).getName() + "-");
} else {
System.out.println(compList.get(i).getName());
}
}
}
}
/**
* 文件(叶子节点)
*
*/
class ComonFile extends Component {
public ComonFile(String name) {
super(name);
}
@Override
public void add(Component c) {
System.out.println("文件中不能添加目录或者文件");
}
@Override
public void remove(Component c) {
System.out.println("文件中不能删除目录或者文件");
}
@Override
public void display() {
System.out.println(this.getName());
}
}
public class CompositePatternCli {
public static void main(String[] args) {
Component rootCataLog = new Catalog("根目录");
rootCataLog.add(new ComonFile("文件1"));
Catalog c1 = new Catalog("目录1");
c1.add(new ComonFile("文件2"));
rootCataLog.add(new Catalog("目录1"));
rootCataLog.add(new Catalog("目录2"));
rootCataLog.display();
}
}
四、总结
1.组合模式由三个角色构成,分别是 抽象组成对象,支节点,叶子节点。抽象组成对象提供一致使用,支节点存储其子节点和增加或者删除子节点。叶子节点不能再添加子节点。
2.组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序像处理简单元素一样来处理复杂元素。
3.适用场景:如果想创建层次结构,且各层次结构的操作基本相同,那么可以考虑适用组合模式。