定义
- 将单个对象和组合对象用相同的接口进行表示
- 使单个对象和组合对象保持一致的处理方式
适用场景
- 希望客户端可以忽略单个对象的组合对象的差异时
- 对象层次具备整体和部分,呈树型结构
实例
public abstract class Directory {
public String name;
public Directory(String name) {
this.name = name;
}
protected abstract void show();
}
public class Folder extends Directory {
private Integer level;
private List<Directory> dirs;
public Folder(String name,int level) {
super(name);
this.level = level;
this.dirs = new ArrayList<Directory>();
}
@Override
protected void show() {
System.out.println(this.name);
for (Directory dir: dirs) {
if (level != null) {
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
for (int i = 0; i < level; i++) {
if (i == 0) {
System.out.print("+");
}
System.out.print("-");
}
}
dir.show();
}
}
public boolean add(Directory directory) {
return this.dirs.add(directory);
}
public boolean remove(Directory directory) {
return this.dirs.remove(directory);
}
}
public class File extends Directory {
public File(String name) {
super(name);
}
@Override
protected void show() {
System.out.println(this.name);
}
}
public class Test {
public static void main(String[] args) {
File qq = new File("qq.exe");
File wx = new File("wx.exe");
Folder office = new Folder("办公软件",3);
File word = new File("word.exe");
File excel = new File("excel.exe");
File ppt = new File("ppt.exe");
office.add(word);
office.add(excel);
office.add(ppt);
Folder root = new Folder("D盘",2);
root.add(qq);
root.add(wx);
root.add(office);
Folder windows = new Folder("windows",1);
windows.add(root);
windows.show();
}
}
应用
- Hashmap - putAll
- Arraylist - addAll
- Mybatis - sqlNode
两种模式
- 透明模式
- 最顶层的抽象类个体和组合的方法都在其中
- 个体和组合继承后都具备其中的方法,叶子节点不具备的,也包含在其中
- 违背最少知道原则
- 最顶层可使用
new unsupportedoperationexception()
- 安全模式
- 最顶层的抽象类只定义所有节点都具备的方法
- 自己独有的只定义在自己的类里面
- 满足最少知道原则
- 组合模式不一定是树型结构
优点
- 清楚的定义了复杂层次的复杂对象,表示对象的全部或者部分层次
- 让客户端忽略层次的差异,方便对整个层次结构进行控制
- 符合开闭原则
缺点
- 限制类型时会较为复杂
- 使设计更为抽象