一、引言
组合模式是什么?为什么要有组合模式?组合模式怎么实现?
- 组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
- 为什么要有组合模式?组合模式广泛适用于对具有层级关系对象的操作,例如对学校,学院,班级增删。对文件夹,文件增删等层级关系的操作。可以不用考虑是父还是子,直接对其操作即可。
二、实现组合模式
先上类图:
所有的学校,学院,班级,都继承一个类(组织),然后学校中有学院list通过add方法添加,remove方法移除,参数都为组织。
这样无论你是学校还是学院,想要添加下属级别,只要调用方法add即可,达到操作上的统一。
下面代码实现一波:
/**
* 组织类
*/
public abstract class Organization {
private String name;//所有组织都有一个名称:学校名称,学院名称,班级名称
//构造方法
public Organization(String name){
this.name=name;
}
//添加方法,这里作空实现,子类重写即可
public void add(Organization organization){
}
//删除方法,这里作空实现,子类重写即可
public void remove(Organization organization){
}
//展示组织信息方法为抽象,子类必须重写
public abstract void display();
//下面是get,set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 学校继承于组织
*/
public class School extends Organization{
private List<Organization> list=new ArrayList<>();//学院list
//调用父类构造方法
public School(String name) {
super(name);
}
//重写add方法
public void add(Organization organization) {
list.add(organization);
}
//重写remove方法
public void remove(Organization organization) {
list.remove(organization);
}
//展现操作
//打印本学校名字,下面遍历list集合里面元素,并调用他们的展示方法
public void display() {
System.out.println("---------------"+this.getName()+"---------------------");
for (Organization organization : list) {
organization.display();
}
}
}
/**
* 学院继承于组织
*/
public class College extends Organization{
private List<Organization> list=new ArrayList<>();//班级list
public College(String name) {
super(name);
}
//重写add方法
public void add(Organization organization) {
list.add(organization);
}
//重写remove方法
public void remove(Organization organization) {
list.remove(organization);
}
//展示方法,和学校无异
public void display() {
System.out.println("---------------"+this.getName()+"---------------------");
for (Organization organization : list) {
organization.display();
}
}
}
/**
* 班级继承于组织
*/
public class Class extends Organization{
public Class(String name) {
super(name);
}
@Override
public void display() {
System.out.println("---------------"+this.getName()+"---------------------");
}
}
下面是Main方法,对各组织进行增删查
public static void main(String[] args) {
//学校
School school = new School("华南理工大学广州学院");
//专业
College college1 = new College("计算机工程学院");
College college2 = new College("外国语学院");
//班级
Class aClass1 = new Class("软件1班");
Class aClass2 = new Class("软件2班");
Class aClass3 = new Class("日语1班");
Class aClass4 = new Class("日语2班");
//对学院,班级添加操作
school.add(college1);
school.add(college2);
college1.add(aClass1);
college1.add(aClass2);
college2.add(aClass3);
college2.add(aClass4);
//展示所有组织操作
System.out.println("------------------展示学校所有信息-----------------------");
school.display();
System.out.println("------------------展示计算机学院所有信息-----------------------");
college1.display();
}
程序运行结果如下图:
代码虽多,但是相对简单,根据类图一步一步分析,注释打满,不多作描述。
三、结束
组合模式很微妙,记住一个点,适用于具有层级关系(树)的对象进行操作的时候。