深度解析设计模式之组合模式

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 组合模式(Composite Pattern),又叫部分整体模式,依据树形结构来组合对象,用来表示部分以及整体层次。

一、介绍

组合模式(Composite Pattern),又叫部分整体模式,依据树形结构来组合对象,用来表示部分以及整体层次。

组合模式 一般用来描述整体部分的关系,它将对象组织到树形结构中,最顶层的节点称为根节点,根节点下面可以包含树枝节点叶子节点,树枝节点下面又可以包含树枝节点叶子节点。如下图所示:

54.jpg

型(用同一接口定义),让它们具备一致行为。

这样,整个树形结构中的对象都是同一种类型,带来的一个好处就是客户无需辨别 树枝节点还是叶子节点,而是可以直接进行操作,给客户使用带来极大的便利。

从设计的角度看,组合模式涉及到三个角色:

  • 抽象根节点:它是一个抽象接口,定义了算法;
  • 具体节点:实现或继承自抽象根节点,完成具体算法操作;
  • 客户端:客户类提出使用具体类的请求;

二、示例

下面,我们拿学校的组织架构为例,比如说一个学校,包含了后勤部、网络部、教学部、保卫部、分校等部门组成,每一个分校,同样具有后勤部、网络部这些。既然这些部门都是学校的部门,基本的操作应该都是一样的,我们可以将所有的部门都拉入学校属性。

用类图表示如下:

55.jpg

实现过程如下!

先创建一个学校接口School,如下:

/**
 * 学校接口
 */
public interface School {
    /**
     * 添加分校或者部门
     * @param school
     */
    void addPart(School school);
    /**
     * 移除分校或者部门
     * @param school
     */
    void removePart(School school);
    /**
     * 展示分校或者部门信息
     */
    void displayPart();
}

然后,创建一个学校具体实现类ConcreteSchool,可以是总校,也可以是分校,如下:

/**
 * 具体学校,可以是总校,也可以是分校
 */
public class ConcreteSchool implements School {
    private String name;//名称
    private List<School> partList = new ArrayList<>();
    public ConcreteSchool(String name) {
        this.name = name;
    }
    @Override
    public void addPart(School school) {
        partList.add(school);
    }
    @Override
    public void removePart(School school) {
        partList.remove(school);
    }
    /**
     * 学校查看部门信息
     */
    @Override
    public void displayPart() {
        for (School school : partList) {
            school.displayPart();
        }
    }
}

接着,创建两个具体的部门,网络部门InternetDepartment、安全部门SecurityDepartment,代码如下:

/**
 * 网络部门
 */
public class InternetDepartment implements School {
    private String name;//名称
    public InternetDepartment(String name) {
        this.name = name;
    }
    @Override
    public void addPart(School school) {}
    @Override
    public void removePart(School school) {}
    @Override
    public void displayPart() {
        System.out.println("我是" + name + ",负责学校的网络管理");
    }
}
/**
 * 安全部门
 */
public class SecurityDepartment implements School {
    private String name;//名称
    public SecurityDepartment(String name) {
        this.name = name;
    }
    @Override
    public void addPart(School school) {}
    @Override
    public void removePart(School school) {}
    @Override
    public void displayPart() {
        System.out.println("我是" + name + ",负责学校的安全工作");
    }
}

最后,编写一个测试类,如下:

public class CompositeClient {
    public static void main(String[] args) {
        //总校部门
        ConcreteSchool rootSchool = new ConcreteSchool("总校");
        rootSchool.addPart(new InternetDepartment("总校网络部门"));
        rootSchool.addPart(new SecurityDepartment("总校安全部门"));
        //分校部门
        ConcreteSchool branchSchool = new ConcreteSchool("分校");
        branchSchool.addPart(new InternetDepartment("分校网络部门"));
        branchSchool.addPart(new SecurityDepartment("分校安全部门"));
        rootSchool.addPart(branchSchool);
        rootSchool.displayPart();//展示信息
    }
}

输出结果:

我是总校网络部门,负责学校的网络管理
我是总校安全部门,负责学校的安全工作
我是分校网络部门,负责学校的网络管理
我是分校安全部门,负责学校的安全工作

从上面的例子,可以很清晰看到类的层次关系,所有的具体对象当作一个单一的对象School来处理。

三、应用

在 Java 的 GUI 容器组件中,就用到了组合模式,所有的子类组件,都可以看作为容器对象。

56.jpg

当然,还有我们使用的 Mybatis 在处理动态 SQL 节点时,也应用到了组合设计模式,Mybatis 会将映射配置文件中定义的动态 SQL 节点、文本节点等解析成对应的 SqlNode 实现,并形成树形结构。

四、总结

当想表达对象的部分-整体的层次结构时,推荐采用组合模式进行设计。

相关文章
|
3天前
|
设计模式 缓存 JavaScript
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
API设计模式:REST、GraphQL、gRPC与tRPC全面解析
9 0
|
2天前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
5 0
|
2天前
|
设计模式 Java 开发者
Java中的设计模式深度解析
Java中的设计模式深度解析
|
4天前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
4天前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
5天前
|
设计模式
组合模式-大话设计模式
组合模式-大话设计模式
5 0
|
2月前
|
设计模式 安全 网络协议
【设计模式】代理模式例子解析
【设计模式】代理模式例子解析
24 2
|
2月前
|
设计模式 Java 数据库连接
JAVA设计模式解析与实战
本文探讨了Java中的常见设计模式,包括单例模式、工厂模式和观察者模式。单例模式确保类只有一个实例,常用于管理资源;工厂模式通过抽象工厂接口创建对象,降低了耦合度;观察者模式实现了一对多的依赖关系,当主题状态改变时,所有观察者都会收到通知。理解并运用这些设计模式能提升代码的复用性、可扩展性和可维护性。
|
4天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
12 2
|
5天前
|
设计模式 搜索推荐
工厂方法模式-大话设计模式
工厂方法模式-大话设计模式
6 1

推荐镜像

更多