解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是 一个树形结构,可以更好的实现管理操作。 => 组合模式
组合模式基本介绍
组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种类型的设计模式属于结构型模式。
组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象
组合模式原理类图

角色说明
Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件, Component 可以是抽象类或者接口
Leaf:在组合中表示叶子节点,叶子节点没有子节点
Composite:非叶子节点,用于存储子部件,在Component接口中实现子部件的相关操作,比如增删改查
组合模式解决学校院系展示
UML类图

代码示例
//Component 这是组合中对象声明抽象类
public abstract class OrganizationComponent {
/**名字*/
private String name;
/**说明*/
private String des;
public OrganizationComponent(String name, String des) {
this.name = name;
this.des = des;
}
protected void add(OrganizationComponent component){
//默认实现 抛出一个异常 不支持操作的异常
throw new UnsupportedOperationException();
}
protected void remove(OrganizationComponent component){
//默认实现 抛出一个异常 不支持操作的异常
throw new UnsupportedOperationException();
}
/**打印方法做成抽象的 因为每个组织都应该有打印方法 子类都需要实现*/
protected abstract void print();
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;
}
}
//-----------------------------------------------------------------------------
//学校类 University就是Composite 可以管理 College
public class University extends OrganizationComponent {
/**学院集合*/
private List<OrganizationComponent> colleges =
new ArrayList<>();
public University(String name, String des) {
super(name, des);
}
/**重写add方法 添加学院功能*/
@Override
protected void add(OrganizationComponent component) {
colleges.add(component);
}
/**重写remove方法 添加删除学院功能*/
@Override
protected void remove(OrganizationComponent component) {
colleges.remove(component);
}
/**print方法 就是输出University 包含的学院*/
@Override
protected void print() {
System.out.println("-------------------"+ getName() +"-------------------");
//遍历所有学院
for (OrganizationComponent college : colleges) {
college.print();
}
}
/**重写get方法*/
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
}
//-----------------------------------------------------------------------------
//学院类 College就是Composite 可以管理 Department
public class College extends OrganizationComponent {
/**系集合*/
private List<OrganizationComponent> departments =
new ArrayList<>();
public College(String name, String des) {
super(name, des);
}
@Override
protected void print() {
System.out.println("------------"+getName()+"------------");
for (OrganizationComponent department : departments) {
department.print();
}
}
/**重写add方法 添加系功能*/
@Override
protected void add(OrganizationComponent component) {
departments.add(component);
}
/**重写remove方法 添加删除系s功能*/
@Override
protected void remove(OrganizationComponent component) {
departments.remove(component);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
}
//-----------------------------------------------------------------------------
//系类 叶子节点
public class Department extends OrganizationComponent {
public Department(String name, String des) {
super(name, des);
}
//add,remove 就不需要重写了 因为他是叶子节点不需要去管理其它组件
protected void print() {
System.out.println(getName());
}
public String getName() {
return super.getName();
}
public String getDes() {
return super.getDes();
}
}
//-----------------------------------------------------------------------------
//测试
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("通信工程","通信工程不好学"));
infoEngineerCollege.add(new Department("信息工程","信息工程很好学"));
//将学院加入到学校中
university.add(computerCollege);
university.add(infoEngineerCollege);
computerCollege.print();
}
}
组合模式在JDK集合的源码分析
Java的集合类-HashMap就使用了组合模式
UML类图 + 代码分析 + 截图