一、概述
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
组合模式的3种角色:
- 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预定义一些默认行为和属性。
- 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。
- 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位。
二、优缺点
优点:1、高层模块调用简单。2、节点自由增加。
缺点:1、继承结构,修改抽象类违反开放关闭原则。2、如果层次结构非常深,递归结构影响效率。
三、实现方式
一个大学有多个学院,一个学院有多个专业构成的树形结构。大学、学院便是树枝节点,专业便是叶子节点。
抽象节点类
public abstract class OrganizationComponent {
private String orgName;
public OrganizationComponent(String orgName){
this.orgName = orgName;
}
// 增加机构
protected void add(OrganizationComponent organizationComponent){
throw new UnsupportedOperationException();
}
// 删除机构
protected void remove(OrganizationComponent organizationComponent){
throw new UnsupportedOperationException();
}
protected abstract void print();
public String getOrgName() {
return orgName;
}
public void setOrgName(String orgName) {
this.orgName = orgName;
}
}
树枝节点类
// 大学
public class University extends OrganizationComponent{
List<OrganizationComponent> organizationComponentList = new ArrayList<>();
public University(String orgName) {
super(orgName);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentList.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentList.remove(organizationComponent);
}
@Override
protected void print() {
System.out.println("大学 =>" + getOrgName());
for (OrganizationComponent organizationComponent : organizationComponentList) {
organizationComponent.print();
}
}
}
// 学院
public class College extends OrganizationComponent{
List<OrganizationComponent> organizationComponentList = new ArrayList<>();
public College(String orgName) {
super(orgName);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentList.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentList.remove(organizationComponent);
}
@Override
protected void print() {
System.out.println("学院 => =>" + getOrgName());
for (OrganizationComponent organizationComponent : organizationComponentList) {
organizationComponent.print();
}
}
}
// 专业
public class Major extends OrganizationComponent{
public Major(String orgName) {
super(orgName);
}
@Override
protected void print() {
System.out.println("专业 => => =>" + getOrgName());
}
}
客户端
public class Client {
public static void main(String[] args) {
// 大学
OrganizationComponent university = new University("科技大学");
// 学院
OrganizationComponent college1 = new College("计算机学院");
OrganizationComponent college2 = new College("信息工程学院");
// 专业
college1.add(new Major("软件工程"));
college1.add(new Major("网络工程"));
college2.add(new Major("通信工程"));
college2.add(new Major("信息工程"));
university.add(college1);
university.add(college2);
university.print();
}
}
结果输出
大学 =>科技大学
学院 => =>计算机学院
专业 => => =>软件工程
专业 => => =>网络工程
学院 => =>信息工程学院
专业 => => =>通信工程
专业 => => =>信息工程
四、常见应用场景
部分、整体场景,如树形菜单,文件、文件夹的管理。