目录
1、例子
2、组合模式基本定义
总结:
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);}@Overrideprotected void add(OrganizationComponent org) {orgs.add(org);}@Overrideprotected void remove(OrganizationComponent org) {orgs.remove(org);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDes() {return super.getDes();}//print方法,就是输出University 包括的学院@Overrideprotected void print() {System.out.println("----------"+getName()+"-------");//遍历orgsfor (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);}@Overrideprotected void add(OrganizationComponent org) {orgs.add(org);}@Overrideprotected void remove(OrganizationComponent org) {orgs.remove(org);}@Overridepublic String getName() {return super.getName();}@Overridepublic String getDes() {return super.getDes();}//print方法,就是输出University 包括的学院@Overrideprotected void print() {System.out.println("----------"+getName()+"-------");//遍历orgsfor (OrganizationComponent org : orgs) {org.print();}}
}
public class Department extends OrganizationComponent{public Department(String name, String des) {super(name, des);}//add,remove 就不用写了,因为他是叶子节点@Overrideprotected void print() {System.out.println(getName());}@Overridepublic String getDes() {return super.getDes();}@Overridepublic 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();}
}
总结:
组织关系由原来的串式流程。变为树状流程。顶层是抽象。后面是各级管理。以及最后节点
各级管理组合或者聚合顶级抽象。实现方法