设计模式之八组合模式
基本介绍:
1) 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结 构,将对象组合成树状结构以表示“整体-部分”的层次关系。
2) 组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
3) 这种类型的设计模式属于结构型模式。
4) 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客 户以一致的方式处理个别对象以及组合对象
原理图:
对原理结构图的说明-即(组合模式的角色及职责)
1) Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子 部件, Component 可以是抽象类或者接口
2) Leaf : 在组合中表示叶子节点,叶子节点没有子节点
3)Composite:非叶子节点,用于存储子部件,在Component接口中实现子部件的相关操作,比如add remove
案例分析
编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组 成,一个学校有多个学院,一个学院有多个系。
uml类图
代码实现:
package com.hy.composite; import lombok.Getter; import lombok.Setter; /** * @author hanyong * @date 2020/11/20 23:09 */ public abstract class OrganizationComponent { @Getter @Setter private String name; @Getter @Setter private String des; public OrganizationComponent(String name, String des) { super(); this.name = name; this.des = des; } //protected修饰子类可以使用 protected void add(OrganizationComponent organizationComponent) { throw new UnsupportedOperationException(); } protected void remove(OrganizationComponent organizationComponent) { throw new UnsupportedOperationException(); } //子类都需要实现 protected abstract void print(); } package com.hy.composite; import java.util.ArrayList; import java.util.List; /** * @author hanyong * @date 2020/11/20 23:19 */ public class University extends OrganizationComponent { private List<OrganizationComponent> colleges = new ArrayList<OrganizationComponent>(); public University(String name, String des) { super(name, des); } //添加学院 @Override protected void add(OrganizationComponent organizationComponent) { colleges.add(organizationComponent); } //删除学院 @Override protected void remove(OrganizationComponent organizationComponent) { colleges.remove(organizationComponent); } @Override protected void print() { //打印学校名字 System.out.println("--------" + getName() + "--------"); for (OrganizationComponent organizationComponent : colleges) { organizationComponent.print(); } } } package com.hy.composite; import java.util.ArrayList; import java.util.List; /** * @author hanyong * @date 2020/11/20 23:31 */ public class College extends OrganizationComponent { //List 中 存放的Department List<OrganizationComponent> organizationComponents = new ArrayList<OrganizationComponent>(); public College(String name, String des) { super(name, des); } // 重写add @Override protected void add(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub // 将来实际业务中,Colleage 的 add 和 University add 不一定完全一样 organizationComponents.add(organizationComponent); } // 重写remove @Override protected void remove(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub organizationComponents.remove(organizationComponent); } @Override protected void print() { System.out.println("--------------" + getName() + "--------------"); //遍历 organizationComponents for (OrganizationComponent organizationComponent : organizationComponents) { organizationComponent.print(); } } } package com.hy.composite; /** * @author hanyong * @date 2020/11/20 23:34 */ public class Department extends OrganizationComponent { public Department(String name, String des) { super(name, des); } @Override protected void print() { System.out.println(getName()); } } package com.hy.composite; /** * @author hanyong * @date 2020/11/20 23:35 */ public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //从大到小创建对象 学校 OrganizationComponent university = new University("清华大学", " 中国顶级大学 "); //创建 学院 OrganizationComponent computerCollege = new College("计算机学院", " 计算机学院 "); OrganizationComponent infoEngineercollege = new College("信息工程学院", " 信息工程学院 "); //创建各个学院下面的系(专业) computerCollege.add(new Department("软件工程", " 软件工程不错 ")); computerCollege.add(new Department("网络工程", " 网络工程不错 ")); computerCollege.add(new Department("计算机科学与技术", " 计算机科学与技术是老牌的专业 ")); // infoEngineercollege.add(new Department("通信工程", " 通信工程不好学 ")); infoEngineercollege.add(new Department("信息工程", " 信息工程好学 ")); //将学院加入到 学校 university.add(computerCollege); university.add(infoEngineercollege); university.print(); //infoEngineercollege.print(); } }
打印结果: