组合模式
一、简介
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
二、使用场景
- 表示对象的部分-整体层次结构时
- 从一个整体中能够独立出部分模块或功能的场景
三、简单实现
我们以电脑系统中的文件夹系统为例来简单实现组合模式。我们知道文件系统是由文件夹和问价构成的,文件夹中可以包含问价或文件夹。
public abstract class Dir{
protected List<Dir> dirs=new ArrayList<>();
private String name;
public Dir(String name) {
this.name = name;
}
public abstract void addDir(Dir dir);
public abstract void print();
public abstract List<Dir> getFiles();
public String getName() {
return name == null ? "" : name;
}
}
public class Folder extends Dir{
public Folder(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
dirs.add(dir);
}
@Override
public void print() {
Log.i(TAG, "print: "+getName());
for (Dir dir : dirs) {
dir.print();
}
}
@Override
public List<Dir> getFiles() {
return dirs;
}
}
public class File extends Dir{
public File(String name) {
super(name);
}
@Override
public void addDir(Dir dir) {
throw new UnsupportedOperationException("文件不支持该操作");
}
@Override
public void print() {
Log.i(TAG, "print: "+getName());
}
@Override
public List<Dir> getFiles() {
throw new UnsupportedOperationException("文件不支持该操作");
}
}
public void tset(){
Folder folderC=new Folder("C");
Folder txtFolder=new Folder("-txtFolder");
Folder picFolder=new Folder("-picFolder");
File file1=new File("-file1");
File file2=new File("--file2");
File file3=new File("--file3");
txtFolder.addDir(file2);
picFolder.addDir(file3);
folderC.addDir(txtFolder);
folderC.addDir(picFolder);
folderC.addDir(file1);
folderC.print();
}
四、小结
在Android中组合模式有一个非常经典的实现就是View和ViewGroup的嵌套组合。一般来将我们在实际开发过程中对于组合模式使用的并不是很多。
组合模式的优点就是可以清楚的定意思分层次的复杂对象,让高层模块忽略层次的差异,方便对整个层次结构进行控制。高层模块可以一致的使用一个组合结构或其中单个对象。
组合模式的缺点就是在新增构建时不好对质感中的构建类型进行限制,不能依赖类型系统来施加这些约束。