一、定义
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式了。
二、UML类图
三、实现
- 组合抽象类
package com.jthao.design.des.composite;
public abstract class Company {
public String name;
public Company(String name) {
this.name = name;
}
abstract void add(Company company);
abstract void remove(Company company);
abstract void display(int depth);
abstract void lineOfDuty();
}
- 公司实现类
package com.jthao.design.des.composite;
import java.util.ArrayList;
import java.util.List;
public class ConcreteCompany extends Company {
private List<Company> list = new ArrayList<Company>();
public ConcreteCompany(String name) {
super(name);
}
@Override
void add(Company company) {
list.add(company);
}
@Override
void remove(Company company) {
list.remove(company);
}
@Override
void display(int depth) {
String str = null;
if (depth == 1) {
str = "-";
} else if (depth == 1) {
str = "--";
} else if (depth == 2) {
str = "---";
} else if (depth == 3) {
str = "----";
} else {
str = "-----";
}
System.out.println(str + name);
for (Company company : list) {
company.display(depth + 1);
}
}
@Override
void lineOfDuty() {
for (Company company : list) {
company.lineOfDuty();
}
}
}
- 部门实现类A
package com.jthao.design.des.composite;
public class HrDept extends Company {
public HrDept(String name) {
super(name);
}
@Override
void add(Company company) {
}
@Override
void remove(Company company) {
}
@Override
void display(int depth) {
String str = null;
if (depth == 1) {
str = "-";
} else if (depth == 1) {
str = "--";
} else if (depth == 2) {
str = "---";
} else if (depth == 3) {
str = "----";
} else {
str = "-----";
}
System.out.println(str + name);
}
@Override
void lineOfDuty() {
System.out.println("HrDept" + name);
}
}
- 部门实现类B
package com.jthao.design.des.composite;
public class FinanceDept extends Company {
public FinanceDept(String name) {
super(name);
}
@Override
void add(Company company) {
}
@Override
void remove(Company company) {
}
@Override
void display(int depth) {
String str = null;
if (depth == 1) {
str = "-";
} else if (depth == 1) {
str = "--";
} else if (depth == 2) {
str = "---";
} else if (depth == 3) {
str = "----";
} else {
str = "-----";
}
System.out.println(str + name);
}
@Override
void lineOfDuty() {
System.out.println("FinanceDept" + name);
}
}
- 测试类
package com.jthao.design.des.composite;
public class Test {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.add(new HrDept("总公司人力部门"));
root.add(new FinanceDept("总公司财务部门"));
ConcreteCompany company1 = new ConcreteCompany("上海分公司");
company1.add(new HrDept("上海分公司人力部门"));
company1.add(new FinanceDept("上海分公司财务部门"));
root.add(company1);
ConcreteCompany company2 = new ConcreteCompany("杭州办事处");
company2.add(new HrDept("杭州办事处人力部门"));
company2.add(new FinanceDept("杭州办事处财务部门"));
company1.add(company2);
ConcreteCompany company3 = new ConcreteCompany("南京办事处");
company3.add(new HrDept("南京办事处人力部门"));
company3.add(new FinanceDept("南京办事处财务部门"));
company1.add(company3);
System.out.println("结构图:");
root.display(1);
System.out.println("职责:");
root.lineOfDuty();
}
}