定义
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
说到组合模式,大家应该会想到“树形结构”、“层次结构”、“物以类聚”、“整体与部分”等字眼,的确,组合模式就是将一些具有一致性的对象组合起来,便于管理。
举例
看下面的代码,定义一个 File 基类:
public interface File {
boolean isDirectory();
}
然后定义一个 Directory 子类:
public class Directory implements File {
private String name;
private Set<File> files = new HashSet<>();
public Directory(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean isDirectory() {
return true;
}
public void add(File file) {
files.add(file);
}
public void remove(File file) {
files.remove(file);
}
public Set<File> getFiles() {
return files;
}
}
Directory 具有容器的功能,所以添加了 add 、remove 等方法。
下面来看一个具体的 PdfFile 的实现过程:
public class PdfFile implements File {
private String name;
public PdfFile(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean isDirectory() {
return false;
}
}
下面是客户类:
public class Client {
public static void main(String[] args) {
Directory root = new Directory("root");
File f = new PdfFile("Design Pattern on JAVA");
File f1 = new PdfFile("开发文档");
File f2 = new PdfFile("设计模式");
Directory d = new Directory("document");
root.add(f);
root.add(d);
d.add(f1);
d.add(f2);
print(root.getName(), 1);
iterate(root, 2);
}
public static void iterate(Directory d, int i) {
for (File f : d.getFiles()) {
if (f.isDirectory() && f instanceof Directory) {
print(((Directory) f).getName(), i);
int j = i + 1;
iterate((Directory) f, j);
} else {
print(f instanceof PdfFile ? ((PdfFile) f).getName() : "", i);
}
}
}
public static void print(String s, int i) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
System.out.println(s);
}
}
以上就是一个简单的组合模式的实现,print 之后就是一个具有层次结构的模型。
Android 中的组合模式
View、ViewGroup 之间的关系就是组合模式的具体表现。
本文由Fynn_原创,未经许可,不得转载!
网友评论