组合模式(composite)是结构性模式的一种。结构型模式的核心作用是从程序的结构上实现低耦合,从而可以扩大整体的类结构,用来解决更大的问题。
模式的使用场景
把部分和整体的关系用树形结构来表示,从而使客户端可以使统一的方式处理部分对象和整体对象。
模式的角色
抽象构建角色(Component):定义了叶子和容器的共同特点。
叶子构建角色(Leaf):无子节点。
容器构建角色(Composite):有容器特征,可包含叶子节点。
模式的示例
这个例子是意在模拟杀毒软件软件的架构流程。
//模式角色:抽象构建角色。定义了叶子和结构的共同特点。
public interface AbstractFile {
//杀毒
void killVirus();
}
//模式角色:叶子构建角色(没有子节点的抽象实现)
class ImageFile implements AbstractFile{
//叶子节点的属性和属性的获得方法
private String name;
public ImageFile(String name){
super();
this.name = name;
}
public void killVirus() {
//抽象方法的实现,这里只输出一句话
System.out.println("ImageFile"+name+"开始杀毒了!");
}
}
//模式角色:叶子构建角色(没有子节点的抽象实现)
class TextFile implements AbstractFile{
//叶子节点的属性和属性的获得方法
private String name;
public TextFile(String name){
super();
this.name = name;
}
public void killVirus() {
//抽象方法的实现,这里只输出一句话
System.out.println("TextFile"+name+"开始杀毒了!");
}
}
//模式角色:容器构建角色:有容器特征,可包含叶子节点。
class File implements AbstractFile{
//叶子节点的属性和属性的获得方法
private String name;
public File(String name){
super();
this.name = name;
}
private List<AbstractFile> list = new ArrayList<AbstractFile>();
//叶子节点的添加方法
public void add(AbstractFile file){
this.list.add(file);
}
//叶子节点的删除方法
public void remove(AbstractFile file){
this.list.remove(file);
}
//叶子节点的获取方法
public AbstractFile getChild(int index){
return list.get(index);
}
public void killVirus() {
//抽象方法的实现,这里先输出一句话
System.out.println("File"+name+"开始杀毒了!");
//这里用循环调用所有子文件
for(AbstractFile file:list){
//这里其实是一个天然的递归,如果子文件是一个文件夹的话,它也会调用自己的子文件
file.killVirus();
}
}
}
//客户端调用
public class Client {
public static void main(String[] args) {
AbstractFile f1,f2;
f1 = new ImageFile("iamimage");
f2 = new TextFile("iamtext");
File f3 = new File("iamfile");
f3.add(f1);
f3.add(f2);
f3.killVirus();
}
}
它会输出:
Fileiamfile开始杀毒了!
ImageFileiamimage开始杀毒了!
TextFileiamtext开始杀毒了!
就是file中会调用它的叶子节点
组合和组合模式
组合模式和组合是不一样的概念:
组合是对类和属性的关系以及类和类的关系的调整和优化,使得类与类,类与属性的关系更加容易理解和扩展。
组合模式是对类与其中的一些不同实现的方法的调度的同意整理和规划的模式,动态的为一个对象增加新的功能。
模式总结
组合模式把一个方法的各种情况的实现通过树状结构的方法组织管理起来,使得客户端可以用统一的方式处理整体和部分对象。