介绍:
1.组合模式又叫部分-整理模式,他创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次结构。
2.组合模式依据树形结构来组合对象,用来表示整体和部分层次。
3.组合模式使得用户对单个对象和组合对象的访问具有一致性,即组合能让客户以一致的方式处理个别对象以及组合对象。
角色说明:
1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。
场景:
1.学校中的学院,学院中的院系。
2.公司中不同的部门。
案例:
总公司-分公司-部门
/**
* 公司职责
*/
public interface Company {
void add(Company company);
void remove(Company company);
void display(int depth);
void lineOfDuty();
}
import java.util.ArrayList;
import java.util.List;
public class ConcreteCompany implements Company {
private String name;
private List<Company> companyList = new ArrayList<Company>();
public ConcreteCompany(String name) {
this.name=name;
}
@Override
public void add(Company company) {
this.companyList.add(company);
}
@Override
public void remove(Company company) {
this.companyList.remove(company);
}
@Override
public void display(int depth) {
//输出树形结构
for(int i=0; i<depth; i++) {
System.out.print('-');
}
System.out.println(name);
//下级遍历
for (Company component : companyList) {
component.display(depth + 1);
}
}
@Override
public void lineOfDuty() {
//职责遍历
for (Company company : companyList) {
company.lineOfDuty();
}
}
}
public class DesignCompany implements Company {
private String name;
private List<Company> companyList = new ArrayList<Company>();
public DesignCompany(String name) {
this.name = name;
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
//输出树形结构的子节点
for (int i = 0; i < depth; i++) {
System.out.print('-');
}
System.out.println(name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " : 公司设计部门管理");
}
}
public class HRDepartment implements Company {
private String name;
public HRDepartment(String name) {
this.name=name;
}
@Override
public void add(Company company) {
}
@Override
public void remove(Company company) {
}
@Override
public void display(int depth) {
//输出树形结构的子节点
for(int i=0; i<depth; i++) {
System.out.print('-');
}
System.out.println(name);
}
@Override
public void lineOfDuty() {
System.out.println(name + " : 员工招聘培训管理");
}
}
public class Client {
public static void main(String[] args) {
//总公司
ConcreteCompany root = new ConcreteCompany("总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new DesignCompany("总公司设计部"));
//分公司
ConcreteCompany company = new ConcreteCompany("上海分公司");
company.add(new HRDepartment("上海分公司人力资源部"));
company.add(new DesignCompany("上海分公司设计部"));
root.add(company);
System.out.println("结构图:");
root.display(1);
System.out.println("\n职责:");
root.lineOfDuty();
}
}