组合模式(Composite)
组合模式是一种结构型模式,它可以将对象组合成树状结构,用来区分部分和整体的层次机构,又叫部分整体模式
角色
- 组件:组合中所有对象的通用接口,可以是抽象类或者接口,声明管理子组件的方法,通常包括新增、删除、获取等方法
- 叶子节点:表示组合叶子节点对象,它没有子节点,实现组件的方法,但不包括子组件
- 复合节点:表示组件中的符合对象,实现组件方法,它可以包含子组件,也可是叶子节点
- 客户端:通过组合接口与组合结构交互,不区分叶子节点和复合节点,可以一致的对待整体与部分
案例
将书作为叶子节点,将目录作为符合节点
java
public interface Component {
void add(Component component);
void remove(Component component);
Component get();
void plant();
}
public class Book implements Component{
private String id;
private String name;
private Integer price;
public Book(String id, String name, Integer price) {
this.id = id;
this.name = name;
this.price = price;
}
@Override
public void add(Component component) {
throw new RuntimeException("非目录,不支持add操作");
}
@Override
public void remove(Component component) {
throw new RuntimeException("非目录,不支持remove操作");
}
@Override
public Component get() {
return this;
}
/** 书只打印名字和价格*/
@Override
public void plant() {
System.out.println(" " + name +"(" + price +")");
}
}
public class Catalogue implements Component{
private String id;
private String name;
private List<Component> items;
private int root;
public Catalogue(String id, String name, List<Component> items, int root) {
this.id = id;
this.name = name;
this.items = items;
this.root = root;
}
@Override
public void add(Component component) {
this.items.add(component);
}
@Override
public void remove(Component component) {
this.items.remove(component);
}
@Override
public Component get() {
return this;
}
/** 目录打印所有书和子目录,用root记录目录层次*/
@Override
public void plant() {
System.out.println("--" + name);
this.items.forEach(a -> {
for (int i = 0; i < root; i++) {
System.out.print(" ");
}
a.plant();
});
}
}