Java组合模式(Composite)

简介: 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象.


组合模式(Composite)

使用组合模式的场景:

 把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象.

组合模式核心:

   抽象构件(Component)角色: 定义了叶子和容器构件的共同点

   叶子(Leaf)构件角色:无子节点

   容器(Composite)构件角色: 有容器特征,可以包含子节点

结构类图

image.png

组合模式工作流程分析:

   组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子。

   当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行。其中,使用了递归调用的机制对整个结构进行处理。

文件管理案例

Component抽象

/**
 * 抽象构建
 * @author 波波烤鸭
 * @email dengpbs@163.com
 *
 */
public interface AbstractFile {
  /**
   * 定义操作的方法
   */
  void operiation();
}

Leaf节点

public class ImageFile implements AbstractFile{
  private String name;
  public ImageFile(String name) {
    super();
    this.name = name;
  }
  @Override
  public void operiation() {
    System.out.println("图片文件:"+name+" 处理操作");
  }
}
public class TextFile implements AbstractFile{
  private String name;
  public TextFile(String name) {
    super();
    this.name = name;
  }
  @Override
  public void operiation() {
    System.out.println("文本文件:"+name+" 处理操作");
  }
}
public class VideoFile implements AbstractFile{
  private String name;
  public VideoFile(String name) {
    super();
    this.name = name;
  }
  @Override
  public void operiation() {
    System.out.println("视频文件:"+name+" 处理操作");
  }
}

Composite容器

/**
 * Composite容器组件
 * @author 波波烤鸭
 * @email dengpbs@163.com
 *
 */
public class Folder implements AbstractFile{
  private String name;
  // 定义容器,用来存储叶子节点  也就是存储文件
  private List<AbstractFile> list = new ArrayList<>();
  public Folder(String name) {
    super();
    this.name = name;
  }
  public void add(AbstractFile file){
    list.add(file);
  }
  public void remove(AbstractFile file){
    list.remove(file);
  }
  public AbstractFile getChild(int index){
    return list.get(index);
  }
  @Override
  public void operiation() {
    System.out.println("处理:"+name+"文件夹");
    for (AbstractFile file : list) {
      file.operiation();
    }
  }
}

测试

public static void main(String[] args) {
  AbstractFile textFile,imageFile,videoFile;
  textFile = new TextFile("readme.txt");
  imageFile = new ImageFile("波波烤鸭.jpg");
  videoFile = new VideoFile("aaa.mp4");
  Folder f = new Folder("c:/tools");
  f.add(videoFile);
  f.add(imageFile);
  f.add(textFile);
  Folder f1 = new Folder("c:/");
  f1.add(videoFile);
  f1.add(videoFile);
  f1.add(imageFile);
  f1.add(f);
  f1.operiation();
}

输出:

处理:c:/文件夹
视频文件:aaa.mp4 处理操作
视频文件:aaa.mp4 处理操作
图片文件:波波烤鸭.jpg 处理操作
处理:c:/tools文件夹
视频文件:aaa.mp4 处理操作
图片文件:波波烤鸭.jpg 处理操作
文本文件:readme.txt 处理操作

开发中的应用场景:

   操作系统的资源管理器

   GUI中的容器层次图

   XML文件解析

   OA系统中,组织结构的处理

   Junit单元测试框架

   • 底层设计就是典型的组合模式,TestCase(叶子)、TestUnite(容器)、Test接口(抽象)

image.png


相关文章
|
4月前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
4月前
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
|
8月前
|
设计模式 Java
Java设计模式【九】:组合模式
Java设计模式【九】:组合模式
66 0
|
7月前
|
设计模式 存储 安全
Java设计模式:组合模式之透明与安全的两种实现(七)
Java设计模式:组合模式之透明与安全的两种实现(七)
|
7月前
|
设计模式 Java
Java设计模式之组合模式详解
Java设计模式之组合模式详解
|
8月前
|
设计模式 安全 Java
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式
|
8月前
|
设计模式 存储 Java
23种设计模式,组合模式的概念优缺点以及JAVA代码举例
【4月更文挑战第5天】组合模式(Composite Pattern)是一种结构型设计模式,旨在通过将对象组合成树形结构以表示部分-整体的层次结构,使用户对单个对象和组合对象的使用具有一致性。这种模式让客户可以统一地处理单个对象和组合对象
89 6
|
8月前
|
设计模式 存储 安全
聊聊Java设计模式-组合模式
组合(Composite)模式,又叫做树形模式,主要用来处理树形结构数据。是将一组对象组织成树形结构,以表示一种“部分-整体”的层次结构。让客户端可以统一单个对象和组合对象的处理逻辑
63 1
聊聊Java设计模式-组合模式
|
8月前
|
设计模式 Rust Java
组合模式 rust和java的实现
组合模式 rust和java的实现
98 0
|
设计模式 存储 Java
JAVA设计模式11:组合模式,以统一的方式处理单个对象和组合对象
JAVA设计模式11:组合模式,以统一的方式处理单个对象和组合对象
188 0