设计模式-组合模式
组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构,在组合模式中用户对单个对象和组合对象的使用具有一致性。
组合模式又分透明模式和安全模式两种
所谓透明模式是将组合相关的方法抽象到父类中,使叶节点和枝节点结构完全相同。但是叶节点的add()和remove()方法其实是冗余的,没有意义的。
安全模式就是将叶节点与枝节点区分开来,叶节点不用实现无用的方法。但是增加了客户端的耦合性,使用时需要判断类型。
我们就拿 Linux ”一切皆文件“ 的文件系统举例
先定义抽象的文件接口
public abstract class File {
protected String name;
public File(String name) {
this.name = name;
}
void display() {
this.display(1);
}
abstract void add(File f);
abstract void remove(File f);
abstract protected void display(int depth);
}
目录实现类,作为枝节点
public class Directory extends File {
List<File> children = new ArrayList<>();
public Directory(String name) {
super(name);
}
@Override
void add(File f) {
children.add(f);
}
@Override
void remove(File f) {
children.remove(f);
}
@Override
protected void display(int depth) {
System.out.println(StringUtils.repeat("-", depth) + this.name);
for (File file : children) {
file.display(depth + 1);
}
}
}
普通文件实现类,这是叶节点
public class CommonFile extends File {
public CommonFile(String name) {
super(name);
}
@Override
void add(File f) {
throw new RuntimeException("leaf node cannot add node");
}
@Override
void remove(File f) {
throw new RuntimeException("leaf node cannot remove node");
}
@Override
protected void display(int depth) {
System.out.println(StringUtils.repeat("-", depth) + this.name);
}
}
测试
public class Demo {
public static void main(String[] args) {
File d1 = new Directory("root");
File d2 = new Directory("etc");
File d3 = new Directory("local");
File c1 = new CommonFile("zshrc");
File d4 = new Directory("security");
File c2 = new CommonFile("audit_user");
d1.add(d2);
d2.add(d3);
d2.add(d4);
d3.add(c1);
d4.add(c2);
d1.display();
}
}