当前位置: 首页 > news >正文

组合模式

1.模式动机与定义

模式动机

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

  • 在文件夹中可以包含文件,还可以继续包含子文件夹
  • 在文件中不能再包含子文件或者子文件夹

文件夹——>容器(Container)

文件——>叶子(Leaf)

模式定义

  1. 组合模式(Composite Pattern):组合多个对象形成树形结构表示“部分整体”的结构层次。组合模式对单个对象(即叶子对象)组合对象(即容器对象)的使用具有一致性。
  2. 对象结构型模式
  3. 将对象组织到树形结构中,可以用来描述整体与部分的关系

2.模式结构与分析

模式结构

组合模式包含如下角色

  1. Component: 抽象构件:抽象构件可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法。如增加、删除、获取等。
  2. Leaf: 叶子构件:叶子构件在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
  3. Composite:容器构件:容器构件在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点。它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为。包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
  4. Client: 客户类:客户类可以通过抽象构件接口访问和控制组合构件中的对象

模式分析

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

同时容器对象与抽象构件类之间还建立一个聚合关联关系,在容器对象中既可以包含叶子,也可以包含容器,以此实现递归组合,形成一个树形结构

//典型的抽象构件角色代码
public abstract class Component{public abstract void add(Component c);public abstract void remove(Component c);public abstract Component getChild(int i);public abstract void operation();
}//典型的叶子构件角色代码
public class Leaf extends Component{public void add(Component c){//异常处理或错误提示}public void remove(Component c){//异常处理或错误提示}public Component getChild(int i){//异常处理或错误提示}public void operation(){//实现代码}
}//容器构件示例代码
public class Composite extends Component {private ArrayList<Component> list=new ArrayList<Component>();public void add(Component c){list.add(c);}public void remove(Component c){list.remove(c);}public Component getChild(int i){return (Component)list.get(i);}public void operation(){//容器构件具体业务方法的实现,将递归调用成员构件的业务方法for(Object obj:list){((Component)obj).operation();}}
}

透明组合模式

  • 抽象构件Component中声明了所有用于管理成员对象的方法,包括add0、remove(),以及getChild()等方法
  • 在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象
  • 缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的

安全组合模式

  • 抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法
  • 对于叶子对象,客户端不可能调用到这些方法
  • 缺点是不够透明,客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件

3.模式效果与应用

优点

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

缺点

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

使用情况

具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异客户端可以一致地对待它们

在一个使用面向对象语言开发的系统中需要处理一个树形结构

在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型

模式应用

  1. XML文档解析
  2. 操作系统中的目录结构是一个树形构,因此在对文件和文件夹进行操作时可以应用组合模式,例如杀毒软件在查毒或杀毒时,既可以针对一个具体文件,也可以针对一个目录。如果是对目录查毒或杀毒,将递归处理目录中的每一个子目录和文件
  3. JDK的AWT/Swing是组合模式在Java类库中的一个典型实际应用。
http://www.rkmt.cn/news/184025.html

相关文章:

  • STM32CubeMX安装教程:一文说清环境变量配置要点
  • 科研级Python环境推荐:Miniconda-Python3.10 + PyTorch实战配置
  • HTML5 WebSockets实现实时模型预测反馈
  • HTML Canvas绘图:前端可视化大模型注意力机制
  • R语言中的模型汇总技巧
  • SSH连接提示Permission denied多种情况解析
  • Flutter渐变效果的艺术:圆角与透明度
  • SSH代理命令ProxyCommand典型应用场景
  • Conan包名中的连字符:如何谨慎处理
  • 【NextChat 】聊天应用全解析
  • 清华镜像支持IPv6访问配置说明
  • 数据采集与融合技术综合实践-途个开心-102302145-黄加鸿
  • PyTorch CUDA out of memory错误环境层面排查
  • Linux下PyTorch安装教程GPU版本:基于Miniconda的轻量级方案
  • SSH连接超时自动重连脚本编写示例
  • Conda环境克隆:快速复制已有PyTorch配置
  • 使用VMware虚拟机群发苹果iMessage短信技术的核心原理与代码实现(教学分享)
  • Miniconda环境变量PYTHONPATH设置技巧
  • Miniconda预编译包优势:避免源码编译耗时
  • 电压信号 vs. 电流信号
  • 单精度浮点数转换:STM32平台深度剖析
  • 系统学习Proteus与Keil协同仿真的完整方案
  • 如何将本地Miniconda环境导出为yml供团队共享?
  • TinyML边缘推理加速实战
  • STM32CubeMX下载全流程图解:通俗解释每一步骤
  • JLink驱动连接失败问题在工控行业的常见原因:一文说清
  • HTML前端展示大模型输出:与后端PyTorch联动架构设计
  • 如何验证PyTorch是否成功调用GPU?代码+命令双验证
  • 硬件I2C常见问题排查:新手必看指南
  • Python安装路径混乱?用Miniconda统一管理所有解释器