「设计模式」组合模式

62 阅读2分钟

一、概述

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

组合模式的3种角色

  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预定义一些默认行为和属性。
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位。

二、优缺点

优点:1、高层模块调用简单。2、节点自由增加。

缺点:1、继承结构,修改抽象类违反开放关闭原则。2、如果层次结构非常深,递归结构影响效率。

三、实现方式

一个大学有多个学院,一个学院有多个专业构成的树形结构。大学、学院便是树枝节点,专业便是叶子节点。

抽象节点类

public abstract class OrganizationComponent {

    private String orgName;

    public OrganizationComponent(String orgName){
        this.orgName = orgName;
    }

    // 增加机构
    protected void add(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    // 删除机构
    protected void remove(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    protected abstract void print();

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

}

树枝节点类

// 大学
public class University extends OrganizationComponent{

    List<OrganizationComponent> organizationComponentList = new ArrayList<>();

    public University(String orgName) {
        super(orgName);
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentList.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponentList.remove(organizationComponent);
    }

    @Override
    protected void print() {
        System.out.println("大学 =>" + getOrgName());
        for (OrganizationComponent organizationComponent : organizationComponentList) {
            organizationComponent.print();
        }
    }
}
// 学院
public class College extends OrganizationComponent{

    List<OrganizationComponent> organizationComponentList = new ArrayList<>();

    public College(String orgName) {
        super(orgName);
    }

    @Override
    protected void add(OrganizationComponent organizationComponent) {
        organizationComponentList.add(organizationComponent);
    }

    @Override
    protected void remove(OrganizationComponent organizationComponent) {
        organizationComponentList.remove(organizationComponent);
    }

    @Override
    protected void print() {
        System.out.println("学院 => =>" + getOrgName());
        for (OrganizationComponent organizationComponent : organizationComponentList) {
            organizationComponent.print();
        }
    }
}
// 专业
public class Major extends OrganizationComponent{
    public Major(String orgName) {
        super(orgName);
    }

    @Override
    protected void print() {
        System.out.println("专业 => => =>" + getOrgName());
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        // 大学
        OrganizationComponent university = new University("科技大学");
        // 学院
        OrganizationComponent college1 = new College("计算机学院");
        OrganizationComponent college2 = new College("信息工程学院");
        // 专业
        college1.add(new Major("软件工程"));
        college1.add(new Major("网络工程"));

        college2.add(new Major("通信工程"));
        college2.add(new Major("信息工程"));

        university.add(college1);
        university.add(college2);

        university.print();
    }
}

结果输出

大学 =>科技大学
学院 => =>计算机学院
专业 => => =>软件工程
专业 => => =>网络工程
学院 => =>信息工程学院
专业 => => =>通信工程
专业 => => =>信息工程

四、常见应用场景

部分、整体场景,如树形菜单,文件、文件夹的管理。