开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
觉得对你有益的小伙伴记得点个赞+关注
后续完整内容持续更新中
希望一起交流的欢迎发邮件至javalyhn@163.com
1. 组合模式定义
将对象组合成树形结构以表示“部分-整体”的层次结构
,使得用户对单个对象和组合对象的使用具有一致性。
2. 组合模式角色定义
Component抽象构建角色:
定义参加组合对象的公有方法和属性。Leaf叶子构件:
叶子对象,其下再没有其他分支。Composite树枝构建:
组合树枝节点和叶子节点形成一个树形结构。
3. 组合模式使用场景
- 层级结构
- 部门组织结构
- 树叶菜单、文件和文件夹管理
4. 组合模式的实现
给定以下学校院系展示案例
OrganizationComponent
public abstract class OrganizationComponent {
private String name; //名字
private String des;//说明
protected void add(OrganizationComponent organizationComponent){
//默认实现
throw new UnsupportedOperationException();
}
protected void remove(OrganizationComponent organizationComponent){
//默认实现
throw new UnsupportedOperationException();
}
//构造器
public OrganizationComponent(String name, String des) {
this.name = name;
this.des = des;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
//打印方法 子类都要实现
protected abstract void print();
}
University
//University就是我们的Composite 可以管理 College
public class University extends OrganizationComponent{
List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public University(String name, String des) {
super(name, des);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponents.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponents.remove(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
//输出University所包含的学院
@Override
protected void print() {
System.out.println("------------" + getName() + "--------------");
//遍历
for (OrganizationComponent organizationComponent : organizationComponents) {
organizationComponent.print();
}
}
}
College
public class College extends OrganizationComponent{
//List 中存放的是 Department
List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>();
public College(String name, String des) {
super(name, des);
}
@Override
protected void add(OrganizationComponent organizationComponent) {
//将来实际业务中 College的add和University不一定完全一样
organizationComponents.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponents.remove(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
//输出University所包含的学院
@Override
protected void print() {
System.out.println("------------" + getName() + "--------------");
//遍历
for (OrganizationComponent organizationComponent : organizationComponents) {
organizationComponent.print();
}
}
}
Department
public class Department extends OrganizationComponent{
//没有集合
public Department(String name, String des) {
super(name, des);
}
//add remove 就不需要再写了 因为他是叶子节点
@Override
protected void print() {
System.out.println(getName());
}
@Override
public String getDes() {
return super.getDes();
}
@Override
public String getName() {
return super.getName();
}
}
Client
public class Client {
public static void main(String[] args) {
//从大到小创建对象
//学校
OrganizationComponent university = new University("清华大学", "中国顶级大学");
//学院
OrganizationComponent computerCollege = new College("计算机学院", "计算机学院");
OrganizationComponent infoEngineerCollege = new College("信息工程学院", "信息工程学院");
//专业
computerCollege.add(new Department("软件工程","软件工程"));
computerCollege.add(new Department("计科","可以"));
computerCollege.add(new Department("网络工程","不错"));
infoEngineerCollege.add(new Department("信息安全","网络安全"));
//将学院加入学校
university.add(computerCollege);
university.add(infoEngineerCollege);
university.print();
//------------清华大学--------------
//------------计算机学院--------------
//软件工程
//计科
//网络工程
//------------信息工程学院--------------
//信息安全
}
}
5. 组合模式优点
高层模块调用简单:
一棵树型机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别。节点自由增加:
用了组合模式以后,非常容易扩展,对维护非常有利。