1. 需求: 学校院系展示
在一个页面中展示学校院系的组成. 学校有多个院系, 每个院系有多个专业…
2. 传统的方案
- 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
- 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的管理的操作,比如对学院、系的添加,删除,遍历等
- 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合模式
3. 组合模式
3.1 基本介绍
- 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系
- 组合模式依据树形结构来组合对象,用来表示部分以及整体层次
- 这种类型的设计模式属于结构型模式
- 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象
3.2 解决问题
组合模式解决这样的问题,当我们的要处理的对象可以生成一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子
3.3 解决学校院系展示问题
package com.liyang;
// 1. 大学 院系 专业我们认为都是组织, 因此我们为这些组织抽象出来一个类
public abstract class OrganizationComponent {
private String name; // 组织名称
private String desc; // 组织描述
// 添加子组织, 这里因为专业没有子组织不需要重写这个方法,因此这里这个方法不做成抽象的
public void add(OrganizationComponent organizationComponent) {
// 默认实现
throw new UnsupportedOperationException();
}
// 删除子组织
public void delete(OrganizationComponent organizationComponent) {
// 默认实现
throw new UnsupportedOperationException();
}
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;
}
public OrganizationComponent(String name, String desc) {
super();
this.name = name;
this.desc = desc;
}
// 打印组织的信息
public abstract void print();
}
package com.liyang;
import java.util.ArrayList;
import java.util.List;
// 2. 大学 泛化 OrganizationComponent
public class University extends OrganizationComponent {
// 用来存储子组织
List<OrganizationComponent> organizationComponent = new ArrayList<OrganizationComponent>();
// 构造器
public University(String name, String desc) {
super(name, desc);
}
@Override
public void add(OrganizationComponent organizationComponent) {
this.organizationComponent.add(organizationComponent);
}
@Override
public void delete(OrganizationComponent organizationComponent) {
this.organizationComponent.remove(organizationComponent);
}
@Override
public void print() {
System.out.println("======="+ getName() +"======");
for (OrganizationComponent organizationComponent2 : organizationComponent) {
organizationComponent2.print();
}
}
}
package com.liyang;
import java.util.ArrayList;
import java.util.List;
// 3. 院系 同理大学
public class College extends OrganizationComponent {
// 用来存储子组织
List<OrganizationComponent> organizationComponent = new ArrayList<OrganizationComponent>();
public College(String name, String desc) {
super(name, desc);
}
@Override
public void add(OrganizationComponent organizationComponent) {
this.organizationComponent.add(organizationComponent);
}
@Override
public void delete(OrganizationComponent organizationComponent) {
this.organizationComponent.remove(organizationComponent);
}
@Override
public void print() {
System.out.println("======="+ getName() +"======");
for (OrganizationComponent organizationComponent2 : organizationComponent) {
organizationComponent2.print();
}
}
}
package com.liyang;
// 4. 专业
public class Department extends OrganizationComponent {
public Department(String name, String desc) {
super(name, desc);
}
@Override
public void print() {
System.out.println("======="+ getName() +"======");
}
}
package com.liyang;
// 5. 测试
public class Client {
public static void main(String[] args) {
// 创建大学
University university = new University("清华", "中国顶级大学");
// 创建学院
College computer = new College("计算机", "学院");
College info = new College("信息", "学院");
// 为学院创建专业
computer.add(new Department("软件", "工程"));
computer.add(new Department("网络", "工程"));
info.add(new Department("通信", "工程"));
info.add(new Department("电本", "工程"));
// 将学院添加到大学
university.add(computer);
university.add(info);
// 打印
university.print();
// 假设我们不关系学校, 只关心计算机学院
computer.print();
}
}