Java设计模式之组合模式
前言
引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”
下面我们用一个很常见的例子来学习组合模式,扫描文。这个文件可以是文件夹也可以是图片更可以是视频,其实文件夹里面可以有文件夹,图片,视频;
首先创建一个抽象类让文件,图片,视频都继承它
public abstract class BaseItem {
public abstract void scan();
}
public class ImageItem extends BaseItem {
private String name;
public ImageItem(String name) {
this.name = name;
}
@Override
public void scan() {
System.out.println("name :" + this.name + " image scan...");
}
}
public class VideoItem extends BaseItem {
private String name;
public VideoItem(String name) {
this.name = name;
}
@Override
public void scan() {
System.out.println("name " +
this.name + "video scan...");
}
}
文件夹类比较特殊,他要维持一个集合,这个集合用来保存其他的子项目,可以是图片,视频或者其他文件夹;
public class FolderItem extends BaseItem {
private String name;
public FolderItem(String name) {
this.name = name;
}
private List<BaseItem> list;
public boolean addItem(BaseItem item) {
if (list == null) {
list = new ArrayList<>();
}
return list.add(item);
}
@Override
public void scan() {
System.out.println("start scan " + this.name + " file");
if (list != null) {
for (BaseItem item : list) {
item.scan();
}
}
}
}
最后我们来测试下
public class Main {
public static void main(String[] args) {
FolderItem folderItem1 = new FolderItem("文件夹1");
folderItem1.addItem(new ImageItem("image1"));
folderItem1.addItem(new ImageItem("image2"));
FolderItem folderItem2 = new FolderItem("文件夹2");
folderItem2.addItem(new VideoItem("video1"));
folderItem2.addItem(new VideoItem("video2"));
folderItem2.addItem(folderItem1);
folderItem2.scan();
}
}
输出:
start scan 文件夹2 file
name video1video scan…
name video2video scan…
start scan 文件夹1 file
name :image1 image scan…
name :image2 image scan…