组合模式:将对象合成树形结果以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
像xml的结构就是组合组合,dom4j解析xml的时候,就是这样的。
- Company:是一个抽象接口,实现所有类共有接口的默认行为。
- ConcreteCompany: 实现类执行具体的添加节点,删除节点,等操作,
- FinanceDepartment,HRDepartment:一个具体的节点部门(可以忽略掉add,和remove方法)
模拟一个总公司 - 分公司的结构和职能输出,
company
public abstract class Company {
protected String name;
public Company(String name) {
this.name = name;
}
public abstract void add(Company c);
public abstract void remove(Company c);
public abstract void dispaly(String depth); // 显示
public abstract void lineOfDuty(); // 履行职责
}
public class ConcreteCompany extends Company {
private List<Company> children = new ArrayList<Company>();
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company c) {
children.add(c);
}
@Override
public void remove(Company c) {
children.remove(c);
}
@Override
public void dispaly(String depth) {
System.out.println("-" + depth + name);
for (Company company : children){
company.dispaly(depth + "--");
}
}
@Override
public void lineOfDuty() {
for (Company company : children){
company.lineOfDuty();
}
}
}
public class FinanceDepartment extends Company {
public FinanceDepartment(String name) {
super(name);
}
@Override
public void add(Company c) {
}
@Override
public void remove(Company c) {
}
@Override
public void dispaly(String depth) {
System.out.println("-" + depth + name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " 公司财务收支管理" );
}
}
public class HRDepartment extends Company {
public HRDepartment(String name) {
super(name);
}
@Override
public void add(Company c) {
}
@Override
public void remove(Company c) {
}
@Override
public void dispaly(String depth) {
System.out.println("-" + depth + name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " 员工招聘培训管理" );
}
}
public class Test {
public static void main(String[] args) {
ConcreteCompany rootChrldren = new ConcreteCompany("北京总公司");
rootChrldren.add(new HRDepartment("总公司人力资源部"));
rootChrldren.add(new FinanceDepartment("总公司财务部"));
ConcreteCompany children = new ConcreteCompany("上海华东分公司");
children.add(new HRDepartment("上海华东分公司人力资源部"));
children.add(new FinanceDepartment("上海华东分公司财务部"));
rootChrldren.add(children);
System.out.println("结构图:");
rootChrldren.dispaly("-");
System.out.println("职责:");
rootChrldren.lineOfDuty();
}
}