简介
- 又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以 表示“整体-部分”的层次关系。
- 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
- 这种类型的设计模式属于结构型模式。
- 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以 及组合对象
组合模式
组合模式
public class People1{
}
聚合模式
public class People2{
}
public class Person{
private People1 people1 = new People1();//组合关系
private People2 people2;//聚合关系
}
-
例题:
编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系。
-
类图分析
Organization 类 做成抽象方法
public abstract class Organization {
private String name;
private String des;
public Organization(String name, String des) {
super();
this.name = name;
this.des = des;
}
protected void add(Organization or) {
throw new UnsupportedOperationException();
}
protected void remove(Organization or) {
throw new UnsupportedOperationException();
}
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();
}
School类
import java.util.ArrayList;
import java.util.List;
public class School extends Organization {
List<Organization> sc = new ArrayList<Organization>();
public School(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getDes();
}
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName();
}
@Override
protected void add(Organization or) {
// TODO Auto-generated method stub
sc.add(or);
}
@Override
protected void remove(Organization or) {
// TODO Auto-generated method stub
sc.remove(or);
}
@Override
protected void print() {
System.out.println(getName()+getDes());
for (Organization organization : sc) {
organization.print();
}
}
}
College类
import java.util.ArrayList;
import java.util.List;
public class College extends Organization {
List<Organization> list = new ArrayList<Organization>();
public College(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getDes();
}
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName();
}
@Override
protected void add(Organization or) {
// TODO Auto-generated method stub
list.add(or);
}
@Override
protected void remove(Organization or) {
// TODO Auto-generated method stub
list.remove(or);
}
@Override
protected void print() {
System.out.println(getName()+getDes());
for (Organization organization : list) {
organization.print();
}
}
}
Department类,不需要再重写add和remove方法
public class Department extends Organization {
public Department(String name, String des) {
super(name, des);
// TODO Auto-generated constructor stub
}
@Override
public String getDes() {
// TODO Auto-generated method stub
return super.getDes();
}
@Override
public String getName() {
// TODO Auto-generated method stub
return super.getName();
}
@Override
protected void print() {
System.out.println(getName() + "描述:" +getDes());
}
}
Client客户端
public class Client {
public static void main(String[] args) {
// 创建学校
Organization sc = new School("XXX", "School");
// 创建学院
Organization c = new College("XXX", "College");
// 创建学科
Organization d = new Department("XXX", "Department");
c.add(new Department("111", "1"));
c.add(new Department("222", "2"));
c.add(new Department("333", "3"));
sc.add(c);
sc.print();
c.print();
}
}