组合模式可以用在树状结构的组合当中,把上下级对象抽象出一个基类,通过这个基类可以实现带分支的父节点,也可以实现单个末端节点。
基类用来提供添加和删除子分支的方法,尽管末端节点不需要添加分支,但还是把编辑子分支的方法统一放到基类当中省去判断节点种类。每个节点的职责可以直接抽象,或者添加一个默认实现:
public abstract class Component {
String name;
public Component(String name) {
this.name = name;
}
abstract void add(Component component);
abstract void remove(Component component);
void function(int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) {
sb.append(" ");
}
sb.append(name);
System.out.println(sb.toString());
}
}
最基本的可以只定义两种类型的实现:
带有分支的实现:
public class ParentCompany extends Component {
private List<Component> list = new ArrayList<>();
public ParentCompany(String name) {
super(name);
}
@Override
void add(Component component) {
list.add(component);
}
@Override
void remove(Component component) {
list.remove(component);
}
@Override
void function(int level) {
super.function(level);
level++;
for (int i = 0; i < list.size(); i++) {
list.get(i).function(level);
}
}
}
不带分支的实现:
public class EndCompany extends Component {
public EndCompany(String name) {
super(name);
}
@Override
void add(Component component) {
}
@Override
void remove(Component component) {
}
}
测试类:
public class Main {
public static void main(String[] args) {
final ParentCompany country = new ParentCompany("国家级总公司");
final ParentCompany province = new ParentCompany("省级总公司");
final EndCompany provinceEnd = new EndCompany("省级办事处");
final ParentCompany city = new ParentCompany("市级总公司");
final EndCompany cityEnd1 = new EndCompany("市级办事处1");
final EndCompany cityEnd2 = new EndCompany("市级办事处2");
final EndCompany townEnd = new EndCompany("镇级办事处");
country.add(province);
country.add(provinceEnd);
province.add(city);
province.add(cityEnd1);
province.add(cityEnd2);
city.add(townEnd);
country.function(0);
}
}
输出:
国家级总公司
省级总公司
市级总公司
镇级办事处
市级办事处1
市级办事处2
省级办事处
对于更复杂的情况可以进一步派生不同的实现,细分更多的分支和终端节点。