目录
1、例子
传统解决方案:
分析:
1、将学院看做是学校的子类,系是学院的子类。这样实际上是站在组织大小来进行分层次的
2、实际上我们的要求是:在一个页面中展现出学校的院系组成。一个学校有多少学院,一个学院有多少个系。因此这种方案,不能很好实现的管理的操作。比如对学院。系的添加。删除,变了等
3、解决方案:把学校、院、系都看做事组织架构。他们之间没有继承的关系。而是一个树形结构。可以更改的实现管理操作=>组合模式
2、组合模式基本定义
2.1、组合模式,又叫部分整体模式,它创建了对象组的树形结构。将对象组合成树状结构以表示“整体-部分”的层次关系
2.2、组合模式依据树形结构来组合对象。用来表示部分以及整体层次
2.3、这种类型的设计模式属于结构型模式
2.4、组合模式使得用户对单个对象和组合对象的访问具有一致性
即:组合能让客户以一致的方式处理个别对象以及组合对象
2、Leaf;在组合中表示叶子节点,叶子节点没有子节点
3、Composite:非叶子节点,用户存储子部件, 在Component接口中实现子部件的相关操作,比如增加,删除
解决的问题:
1、组合模式解决这样的问题。当我们的要处理的对象可以生产一颗树形结构,而我们要对树上的节点和叶子进行操作时,它能够提供一致的方式,而不用考虑它是节点还是叶子
public class University extends OrganizationComponent {
List<OrganizationComponent> orgs=new ArrayList<>();
public University(String name, String des) {
super(name, des);
}
@Override
protected void add(OrganizationComponent org) {
orgs.add(org);
}
@Override
protected void remove(OrganizationComponent org) {
orgs.remove(org);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
//print方法,就是输出University 包括的学院
@Override
protected void print() {
System.out.println("----------"+getName()+"-------");
//遍历orgs
for (OrganizationComponent org : orgs) {
org.print();
}
}
}
public class College extends OrganizationComponent{
//list中
List<OrganizationComponent> orgs=new ArrayList<>();
public College(String name, String des) {
super(name, des);
}
@Override
protected void add(OrganizationComponent org) {
orgs.add(org);
}
@Override
protected void remove(OrganizationComponent org) {
orgs.remove(org);
}
@Override
public String getName() {
return super.getName();
}
@Override
public String getDes() {
return super.getDes();
}
//print方法,就是输出University 包括的学院
@Override
protected void print() {
System.out.println("----------"+getName()+"-------");
//遍历orgs
for (OrganizationComponent org : orgs) {
org.print();
}
}
}
public class Department extends OrganizationComponent{
public Department(String name, String des) {
super(name, des);
}
//add,remove 就不用写了,因为他是叶子节点
@Override
protected void print() {
System.out.println(getName());
}
@Override
public String getDes() {
return super.getDes();
}
@Override
public String getName() {
return super.getName();
}
}
public abstract class OrganizationComponent {
private String name;//名字
private String des;//说明
protected void add(OrganizationComponent org){
//默认实现
throw new UnsupportedOperationException();
}
protected void remove(OrganizationComponent org){
//默认实现
throw new UnsupportedOperationException();
}
public OrganizationComponent(String name, String des) {
this.name = name;
this.des = des;
}
//方法print 抽象
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;
}
}
public class Clinet {
public static void main(String[] args) {
//从大道小创建对象
OrganizationComponent university = new University("清华大学", "中国顶级大学");
//创建 学院
OrganizationComponent college = new College("计算机学院", "计算机学院");
OrganizationComponent college1 = new College("信息工程学院", "信息工程学院");
//创建各个学院下面的系(专业)
college.add(new Department("软件工程","软件工程"));
college.add(new Department("网络工程","网络工程"));
college.add(new Department("计算机","计算机"));
college1.add(new Department("信息工程","信息工程"));
college1.add(new Department("智能工程","智能工程"));
college1.add(new Department("大数据工程","大数据工程"));
university.add(college);
university.add(college1);
// university.print();
college.print();
}
}
总结:
组织关系由原来的串式流程。变为树状流程。顶层是抽象。后面是各级管理。以及最后节点
各级管理组合或者聚合顶级抽象。实现方法