组合模式顾名思义就是将对象组合(一种递归组合),而对于用户来说,组合对象与普通对象的操作没有区别。举个例子形象点说:硬盘里的文件夹的组织方式就是组合模式,文件夹里可以包含文件与文件夹,文件夹里又可以包含文件夹。
组合模式是以后要讲的 装饰模式,组合的迭代器模式的基础,所以很重要。
当然,一图胜千言,上图!
从图上可以看出leaf类和composite类都是抽象类AbsytractComponent的子类。并且composite类与AbsytractComponent是组合的关系(即:composite类的对象能够包含AbsytractComponent类的对象,用上面文件夹的例子来解释的话,composite就是文件夹,leaf是具体文件,并且我们把文件和文件夹都抽象成组建--对应AbsytractComponent)
下面上一段代码,来具体看一下组合模式的实现。
抽象组件类 File文件类
定义了添加组件,移除组件的方法。
public abstract class File {
public abstract void add(File element);
public abstract void remove(File element);
}
具体组合类
注意其中定义了一个ArrayList用于存放组件对象。
class Folder extends File
{
private ArrayList filelist=new ArrayList();
private String fileName;
public Folder(String filename)
{
this.fileName=filename;
}
public void add(File e)
{
filelist.add(e);
}
public void remove(File e)
{
filelist.remove(e);
}
}
三个具体文件类
class ImageFile extends File
{
private String fileName;
public ImageFile(String filename)
{
this.fileName=filename;
}
public void add(File e)
{
System.out.println("对不起,不支持该方法");
}
public void remove(File e)
{
System.out.println("对不起,不支持该方法");
}
}
class VideoFile extends File
{
private String fileName;
public VideoFile(String filename)
{
this.fileName=filename;
}
public void add(File e)
{
System.out.println("对不起,不支持该方法");
}
public void remove(File e)
{
System.out.println("对不起,不支持该方法");
}
}
class TextFile extends File
{
private String fileName;
public TextFile(String filename)
{
this.fileName=filename;
}
public void add(File e)
{
System.out.println("对不起,不支持该方法");
}
public void remove(File e)
{
System.out.println("对不起,不支持该方法");
}
}
}
客户端代码便是先创建具体文件对象,然后再调用组合类对象的add方法来进行组合。要注意的是具体文件类虽然重写了add方法,但是它没有具体实现。
组合模式的优点主要有以下几个:
1、组合模式使得我们能够更加容易地定义层次复杂的对象。
2、对于用户来说,组合对象的操作和普通对象的操作时没有区别的。组合对象封装了对其包含的普通对象和组合对象的操作。(这有点递归的意思)。