组合模式

组合模式概述

引入:Windows操作系统目录结构

分析:在树形目录结构中,包含文件和文件夹两类不同的元素。

  • 在文件夹中可以包含文件,还可以继续包含子文件夹。
  • 在文件中不能再包含子文件或者子文件夹。
  • 文件夹 <–> 容器(Container)
  • 文件 <–> 叶子(Leaf)

当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使程序非常复杂。

那么,如何一致地对待容器对象和叶子对象?

组合模式的定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。又称为“部分-整体”(Part-Whole)模式。将对象组织到树形结构中,可以用来描述整体与部分的关系。

组合模式的结构与实现

组合模式的结构

组合模式包含以下3个角色:

  • Component(抽象构件):其中定义了访问以及管理它的子构件的方法。
  • Leaf(叶子构件):表示叶子节点对象,叶子节点没有子节点。
  • Composite(容器构件):表示容器节点对象,容器节点包含子节点。

组合模式的关键在于定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,客户端对该抽象构件类进行编程,无需知道它到底代表的是叶子还是容器,可以对齐进行统一处理。

组合模式应用实例

某软件公司欲开发一个杀毒(Antivirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile)和文本文件(TextFile)的杀毒方式就有所差异。现使用组合模式来设计该杀毒软件的整体框架。

  • (1) AbstractFile:抽象文件类,充当抽象构件类
  • (2) ImageFile:图像文件类,充当叶子构件类
  • (3) TextFile:文本文件类,充当叶子构件类
  • (4) VideoFile:视频文件类,充当叶子构件类
  • (5) Folder:文件夹类,充当容器构件类
  • (6) Client:客户端测试类

在这个实例中,抽象构件类声明了所有方法,包括用于管理和访问子构件的方法,例如add()和remove()等方法,因此,在叶子构件类中实现这些方法时必须进行相应的异常处理或者错误提示。

组合模式的优缺点与适用环境

模式优点

  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构进行控制。
  • 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
  • 增加新的容器构件和叶子构件都很方便,符合开闭原则。
  • 为树形结构的面向对象实现提供了一种灵活的解决方案。

模式缺点

  • 在增加新构件时很难对容器中的构件类型进行限制。

模式适用环境

  • 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
  • 在一个使用面向对象语言开发的系统中需要处理一个树形结构。
  • 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

发表回复

Breeze Wang

A student majoring in Software Engineering at Central South University has an understanding of software development techniques, software architecture, and is able to use Godot to develop game projects. I am currently in the Game Development Laboratory at Central South University. I have experience participating in Global Game Jam. Loving game development.