定义
组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象和组合对象。
组成角色
(1)组合部件(Component):它是一个抽象接口。这里表示树根。
(2)叶子(Leaf):在组合中表示子节点对象,这里表示的是文件,其没有孩子了。
(3)合成部件(Composite):表示自己还有孩子,这里表示的是文件夹。
应用场景
当想表达对象的部分-整体的层次结构时。希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
优缺点
缺点:客户端需要花更多时间理清类之间的层次关系
优点:无需关系处理的单个对象,还是组合的对象容器,实现容器之间的解耦合。当有新部件时容易添加进来。
图例
代码示例
/**
* 文件夹
* @author lu
* @since 1.0, 2020年7月4日
*/
public abstract class File {
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();
}
/**
* 文件夹类 - 该类包含对文件的增加,删除和浏览三个方法
* @author lu
* @since 1.0, 2020年7月4日
*/
public class Folder extends File{
private List<File> files;
public Folder(String name) {
super(name);
files = new ArrayList<File>();
}
/**
* 浏览文件夹中的文件
*/
@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);
}
}
/**
* 文本文件类
* @author lu
* @since 1.0, 2020年7月4日
*/
public class TextFile extends File{
public TextFile(String name) {
super(name);
}
@Override
public void display() {
System.out.println("文本文件,文件名:"+super.getName());
}
}
/**
* 图像文件
* @author lu
* @since 1.0, 2020年7月4日
*/
public class ImageFile extends File{
public ImageFile(String name) {
super(name);
}
public void display(){
System.out.println("图像文件,文件名"+super.getName());
}
}
/**
* 影像文件
* @author lu
* @since 1.0, 2020年7月4日
*/
public class VideoFile extends File{
public VideoFile(String name) {
super(name);
}
@Override
public void display() {
System.out.println("影像文件,文件名:"+super.getName());
}
}
/**
* 客户端测试
* @author lu
* @since 1.0, 2020年7月4日
*/
public class Client {
public static void main(String[] args) {
/**
* 建立文件系统
* 总文件
* a.txt b.jpg c文件夹
* c_1.text c_1.rmvb c_1.jpg
*/
//1、总文件夹
Folder zwjj = new Folder("总文件夹");
//2、向总文件夹里放入三个文件: a.txt b.jpg c文件夹
TextFile aText = new TextFile("a.text");
ImageFile bImage = new ImageFile("b.jpg");
Folder cFolder = new Folder("c文件夹");
zwjj.add(aText);
zwjj.add(bImage);
zwjj.add(cFolder);
//3、向c文件夹中添加文件:c_1.text c_1.rmvb c_1.jpg
TextFile c_1Text = new TextFile("c_1.text");
VideoFile c_1Video = new VideoFile("c_1.rmvb");
ImageFile c_1Image = new ImageFile("c_1.jpg");
cFolder.add(c_1Text);
cFolder.add(c_1Video);
cFolder.add(c_1Image);
System.out.println("-----删除前C文件夹里的文件-----");
//遍历c文件夹
cFolder.display();
//将c_1.txt删除
cFolder.remove(c_1Text);
System.out.println("-----删除后C文件夹里的文件-----");
cFolder.display();
}
}
运行结果