组合模式简介
- 组合模式(Composite Pattern)又叫整体模式,它创建了对象组的树形结构,将对象组合成树状结构来表示“整体-部分”的层次关系。
- 实际使用点:HashMap中构造函数,有可以添加整个集合的构造,就是组合模式。
结构
- 1.Component:抽象根节点,定义系统各层次对象的共有方法和属性,用于访问和管理Component子部件,Component可以是抽象类或者接口。
- 2.Composite:非叶子节点,用来存储子部件,实现了Component结构,并用 组合 关系 组合Component对象,一般用来增加(add)、删除(delete)
- 3.Leaf:叶子节点,叶子节点没有子节点。
UML图

具体实现
例子:一个学校(University)有多个学院(College),一个学院有多个专业(Department),输出这个学校的树形结构。
UML图

代码实现
- 抽象根节点
package com.xxliao.pattern.structure.composite.demo;
/**
* @author xxliao
* @description: 组合模式的 抽象根节点
* @date 2024/5/25 13:42
*/
public abstract class OrganizationComponent {
private String name;
private String desc;
public OrganizationComponent(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
/**
* @description add
* @author xxliao
* @date 2024/5/25 13:45
*/
public void add(OrganizationComponent organizationComponent) {
// 抽象根节点不能添加
throw new UnsupportedOperationException();
}
/**
* @description delete
* @author xxliao
* @date 2024/5/25 13:45
*/
public void delete(OrganizationComponent organizationComponent) {
// 抽象根节点不能添加
throw new UnsupportedOperationException();
}
/**
* @description print
* @author xxliao
* @date 2024/5/25 13:46
*/
public abstract void print();
}
- 非叶子节点
package com.xxliao.pattern.structure.composite.demo;
import java.util.ArrayList;
import java.util.List;
/**
* @author xxliao
* @description: Composite 类 ,大学类 可以管理 College类
* @date 2024/5/25 13:48
*/
public class University extends OrganizationComponent{
// 子节点集合 ,采用组合关系 集成了 OrganizationComponent抽象根节点
private List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public University(String name, String desc) {
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
public void add(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
@Override
public void delete(OrganizationComponent organizationComponent) {
organizationComponents.remove(organizationComponent);
}
@Override
public void print() {
System.out.println("=================="+getName()+"=================");
for (OrganizationComponent organizationComponent : organizationComponents) {
organizationComponent.print();
}
}
}
package com.xxliao.pattern.structure.composite.demo;
import java.util.ArrayList;
import java.util.List;
/**
* @author xxliao
* @description: Composite 类 ,学院类 可以管理 Department类
* @date 2024/5/25 13:48
*/
public class College extends OrganizationComponent{
// 子节点集合 ,采用组合关系 集成了 OrganizationComponent抽象根节点
private List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public College(String name, String desc) {
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
public void add(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
@Override
public void delete(OrganizationComponent organizationComponent) {
organizationComponents.remove(organizationComponent);
}
@Override
public void print() {
System.out.println("=================="+getName()+"=================");
for (OrganizationComponent organizationComponent : organizationComponents) {
organizationComponent.print();
}
}
}
- 叶子节点
package com.xxliao.pattern.structure.composite.demo;
/**
* @author xxliao
* @description: leaf 类 ,子节点类
* @date 2024/5/25 13:48
*/
public class Department extends OrganizationComponent{
public Department(String name, String desc) {
super(name, desc);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDesc() {
return super.getDesc();
}
@Override
public void print() {
System.out.println(getName());
}
}
- 测试客户端
package com.xxliao.pattern.structure.composite.demo;
/**
* @author xxliao
* @description: 组合模式 测试客户端
* @date 2024/5/25 13:57
*/
public class Client {
public static void main(String[] args) {
// 创建大学
OrganizationComponent university = new University("xxliao大学", "TOP1");
// 创建学院
OrganizationComponent computer = new College("计算机学院", "计算机学院");
OrganizationComponent finance = new College("经济管理学院", "经管学院");
// 将学院添加到大学中
university.add(computer);
university.add(finance);
//创建专业
computer.add(new Department("计算机科学与技术","计算机科学与技术"));
computer.add(new Department("软件工程","软件工程"));
computer.add(new Department("网络工程","网络工程"));
finance.add(new Department("经济学","经济学"));
finance.add(new Department("国际金融与贸易","国际金融与贸易"));
// 打印整个大学结构
university.print();
}
}
- 测试结果

1042

被折叠的 条评论
为什么被折叠?



