组合模式应用举例子:我们开发一个需求,要求呈现学校+学院+专业的场景,便于学校管理学院,学院管理专业。
解决方案:传统的思维是,写一个学校类,再写一个学院类继承学校,再写一个专业类继承学院。缺点:这种结构不适合进行各个层级的管理。
组合模式:采用聚合的方式,写一个组合的抽象类或者接口,然后学校和学院继承或者实现该类。
组合模式的使用场景:
1、需要遍历的组织机构或者处理的对象具有树形结构。
2、如果节点和叶子存在很多差异性的话,属性和方法都不一样,就不太适合使用该模式。
组合模式使用的具体例子:
JDK中 Map接口,abstractMap, hashMap 其中的node方法就相当于 叶子节点
废话不多说,直接上代码:
创建组合抽象类或者接口
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();
}
创建学校类:
//可以管理学校
public class University extends OrganizationComponent{
//存放的是College
List<OrganizationComponent> organizationComponentlist = new ArrayList<OrganizationComponent>();
public University(String name, String des) {
super(name, des);
}
@Override
protected void print() {
System.out.println("----------------"+getName()+"-------------");
for (OrganizationComponent orl: organizationComponentlist) {
orl.print();
}
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentlist.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentlist.remove(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name);
}
@Override
public String getDes() {
return super.getDes();
}
@Override
public void setDes(String des) {
super.setDes(des);
}
}
创建学院类:
public class College extends OrganizationComponent{
//存放的是department
List<OrganizationComponent> organizationComponentlist = new ArrayList<OrganizationComponent>();
public College(String name, String des) {
super(name, des);
}
@Override
protected void print() {
System.out.println("----------------"+getName()+"-------------");
for (OrganizationComponent orl: organizationComponentlist) {
orl.print();
}
}
@Override
protected void add(OrganizationComponent organizationComponent) {
organizationComponentlist.add(organizationComponent);
}
@Override
protected void remove(OrganizationComponent organizationComponent) {
organizationComponentlist.remove(organizationComponent);
}
@Override
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name);
}
@Override
public String getDes() {
return super.getDes();
}
@Override
public void setDes(String des) {
super.setDes(des);
}
}
创建最后的专业系类(最后的节点是没有管理方法的):
public class Department extends OrganizationComponent{
//因为是叶子节点,所以add 和remove方法就不需要了
public Department(String name, String des) {
super(name, des);
}
@Override
protected void print() {
System.out.println(getName());
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
}
测试类如下:
public class Client {
public static void main(String[] args) {
OrganizationComponent university = new University("麻省理工","美国一流大学");
OrganizationComponent computerCollege = new College("计算机学院","学校里最好的学院");
OrganizationComponent businessCollege = new College("工商管理学院","最有钱的学院");
//创建各个学院下面的系
computerCollege.add(new Department("软件工程","学习软件"));
computerCollege.add(new Department("网络工程","学习网络"));
computerCollege.add(new Department("计算机科学与技术","学习计算机原理"));
businessCollege.add(new Department("工商管理","学习工商管理"));
businessCollege.add(new Department("会计","学习会计"));
businessCollege.add(new Department("工商英语","学习工商英语"));
//将两个学院加入到学校中
university.add(computerCollege);
university.add(businessCollege);
university.print();
// computerCollege.print();
}
}
最后输出的结果如下,很清晰,舒服!
----------------麻省理工-------------
----------------计算机学院-------------
软件工程
网络工程
计算机科学与技术
----------------工商管理学院-------------
工商管理
会计
工商英语