设计模式之组合模式

组合模式

定义

组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系,其定义如下:

Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.(将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。)
在这里插入图片描述

我们先来说说组合模式的几个角色:

  1. Component抽象构件角色

定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性,比如我们例子中的getInfo就封装到了抽象类中。

·Leaf叶子构件

叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。

  1. Composite树枝构件

树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。

优缺点

优点
  1. 高层模块调用简单

    一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。

  2. 节点自由增加

    使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

缺点

组合模式有一个非常明显的缺点,看到我们在场景类中的定义,提到树叶和树枝使用时的定义了吗?直接使用了实现类!这在面向接口编程上是很不恰当的,与依赖倒置原则冲突。

示例代码

  1. 抽象类组件
public abstract class Component {
   
    public void doSomething() {
   
        System.out.println("component do something");
    }
}
  1. 组合类

    public class Composite extends Component {
         
        // 构件容器
        private List<Component> componentArrayList = new ArrayList<Component>();
    
        // 增加一个叶子构件或树枝构件
        public void add(Component component) {
         
            this.componentArrayList.add(component);
        }
    
        // 删除一个叶子构件或树枝构件
        public void remove(Component component) {
         
            this.componentArrayList.remove(component);
        }
    
        // 获得分支下的所有叶子构件和树枝构件
        public List<Component> getChildren() {
         
            return this.componentArrayList;
        }
    }
    
  2. 叶子节点

    public class Leaf extends Component {
         
        @Override
        public void doSomething() {
         
            System.out.println("leaf do something");
        }
    }
    
  3. 测试方法

    @Test
    public void test() {
         
        // 创建一个根节点
        Composite root = new Composite();
        root.doSomething();
        // 创建一个树枝构件
        Composite branch = new Composite();
        // 创建一个叶子节点
        Leaf leaf = new Leaf();
        // 建立整体
        root.add(branch);
        branch.add(leaf);
        display(root);
    }
    
    // 通过递归遍历树
    public static void display(Composite root) {
         
        for (Component c : root.getChildren()) {
         
            if (c instanceof Leaf) {
          // 叶子节点
                c.doSomething();
            } else {
          // 树枝节点
                display((Composite)c);
            }
        }
    }
    

运行结果

component do something
leaf do something

示例代码地址

https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/structure/composite

相关推荐

  1. 设计模式组合模式

    2024-01-01 21:46:05       24 阅读
  2. go设计模式组合设计模式

    2024-01-01 21:46:05       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-01 21:46:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-01 21:46:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-01 21:46:05       82 阅读
  4. Python语言-面向对象

    2024-01-01 21:46:05       91 阅读

热门阅读

  1. 国内低代码平台介绍及优势盘点

    2024-01-01 21:46:05       48 阅读
  2. 微服务(8)

    2024-01-01 21:46:05       56 阅读
  3. Golang标准库sync的使用

    2024-01-01 21:46:05       54 阅读
  4. 源码解析:mybatis调用链之获取sqlSession

    2024-01-01 21:46:05       59 阅读
  5. 浅析 Dockerfile 构建缓存:原理与优化方法

    2024-01-01 21:46:05       56 阅读
  6. python弹奏《起风了》

    2024-01-01 21:46:05       59 阅读
  7. 我自己的Mac装机软件推荐!

    2024-01-01 21:46:05       47 阅读
  8. 网络安全领域八大国际认证

    2024-01-01 21:46:05       55 阅读
  9. MySQL第七章:MySQL的基本函数

    2024-01-01 21:46:05       61 阅读
  10. CSS中背景设置——渐变色和放射渐变

    2024-01-01 21:46:05       45 阅读
  11. (C)一些题15

    2024-01-01 21:46:05       49 阅读
  12. springboot中使用mongodb进行简单的查询

    2024-01-01 21:46:05       56 阅读
  13. CMEMS数据下载

    2024-01-01 21:46:05       57 阅读
  14. 功能开发 -- 向埃隆·马斯克学习任务分解

    2024-01-01 21:46:05       55 阅读