组合模式

  • 专栏目录
  • 组合模式的意图,解决的问题,什么时候使用
  • 1.桥接模式
  • 2.组合模式中的角色
    • 2.1 透明方式
    • 2.2 安全组合方式
  • 3.组合模式优缺点、使用场景
    • 优点:
    • 缺点:
    • 适用场景:

专栏目录

  • 创建型模式: 工厂三兄弟 , 单例模式 , 原型模式 , 建造者模式
  • 结构型模式: 适配器模式 , 桥接模式 , 组合模式 , 装饰器模式, 外观模式(门面模式), 享元模式, 代理模式
  • 行为型模式: 职责链模式, 命令模式, 解释器模式, 迭代器模式, 中介者模式, 备忘录模式, 观察者模式, 状态模式, 策略模式, 模板方法, 访问者模式

组合模式的意图,解决的问题,什么时候使用

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣服与衣柜、以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。

1.桥接模式

组合(Composite Pattern)模式,有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

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


由上图可以看出,其实根节点和树枝节点本质上属于同一种数据类型,可以作为容器使用;而叶子节点与树枝节点在语义上不属于用一种类型。但是在组合模式中,会把树枝节点和叶子节点看作属于同一种数据类型(用统一接口定义),让它们具备一致行为。

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

2.组合模式中的角色

组成(角色) 作用
抽象构件(Component)角色 它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
树叶构件(Leaf)角色 是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
树枝构件(Composite)角色 / 中间构件 是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

2.1 透明方式

在该方式中,由于抽象构件声明了所有子类中的全部方法,所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,却要实现它们(空实现或抛异常),这样会带来一些安全性问题。其结构图如下图所示。

标准程序代码如下:

public class CompositePattern {public static void main(String[] args) {Component c0 = new Composite();Component c1 = new Composite();Component leaf1 = new Leaf("1");Component leaf2 = new Leaf("2");Component leaf3 = new Leaf("3");c0.add(leaf1);c0.add(c1);c1.add(leaf2);c1.add(leaf3);c0.operation();}
}
//抽象构件
interface Component {public void add(Component c);public void remove(Component c);public Component getChild(int i);public void operation();
}
//树叶构件
class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}public void add(Component c) {}public void remove(Component c) {}public Component getChild(int i) {return null;}public void operation() {System.out.println("树叶" + name + ":被访问!");}
}
//树枝构件
class Composite implements Component {private ArrayList<Component> children = new ArrayList<Component>();public void add(Component c) {children.add(c);}public void remove(Component c) {children.remove(c);}public Component getChild(int i) {return children.get(i);}public void operation() {for (Object obj : children) {((Component) obj).operation();}}
}

运行结果:

树叶1:被访问!
树叶2:被访问!
树叶3:被访问!

2.2 安全组合方式

安全式的组合模式与透明式组合模式的实现代码类似,只要对其做简单修改就可以了,代码如下。

首先修改 Component 代码,只保留层次的公共行为。

interface Component {public void operation();
}

然后修改客户端代码,将树枝构件类型更改为 Composite 类型,以便获取管理子类操作的方法。

public class CompositePattern {public static void main(String[] args) {Composite c0 = new Composite();Composite c1 = new Composite();Component leaf1 = new Leaf("1");Component leaf2 = new Leaf("2");Component leaf3 = new Leaf("3");c0.add(leaf1);c0.add(c1);c1.add(leaf2);c1.add(leaf3);c0.operation();}
}

安全模式的缺点就是不能完全面向抽象编程。

3.组合模式优缺点、使用场景

优点:

  • 1.组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  • 2.更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
  • 3.为树形结构的面向对象实现提供了一种灵活的解决方案

缺点:

  • 1.设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  • 2.不容易限制容器中的构件;
  • 3.不容易用继承的方法来增加构件的新功能(特别是针对安全模式);

适用场景:

  • 1.在需要表示一个对象整体与部分的层次结构的场合,尤其是树形结构。
  • 2.一个系统中能够分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型。

参考文章:http://c.biancheng.net/view/1373.html

(2021总结篇)面向对象软件设计模式--(八)结构型模式---树形结构的处理--组合模式相关推荐

  1. 软件设计模式:结构型模式

    1.桥接模式:将抽象部分与它的实现部分分离. 2.适配器模式:将一个接口转换成客户希望的另一个接口,从而使接口不兼容的那些类可以一起工作. 3.装饰模式:动态地给一个对象增加一些额外的职责. 4.组合 ...

  2. Java最全的设计模式之结构型模式

    这篇接着上篇,结构型模式包含了七种,没有看过上篇的可以点击超链接 Java设计模式之创建型模式 Java设计模式之创建型模式 9.适配器模式 9.1结构型模式 9.2适配器模式的定义 9.3适配器模式 ...

  3. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  4. 设计模式05——结构型模式

    一.概述  结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象.由于组合关系或聚合关系比继承关系耦合 ...

  5. 设计模式3——结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足&q ...

  6. 设计模式_结构型模式学习

    其中,单例模式用来创建全局唯一的对象.工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可 ...

  7. 设计模式 之 结构型模式

    设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...

  8. 设计模式之结构型模式(5种)

    目录 结构型模式(Structural Pattern):怎么构造一个对象(行为.属性) 一.适配器模式 二.桥接模式(Bridge) 三.装饰者模式 设计模式在JAVA I/O库中的应用 案例 使用 ...

  9. JAVA23种设计模式(2)-结构型模式7种

    JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...

  10. 设计模式:结构型模式-桥接、外观、组合、享元模式

    结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...

最新文章

  1. 《Cracking the Coding Interview》——第18章:难题——题目11
  2. JavaScript Table排序
  3. MyEclipse下SVN的配置(下载及其配置)
  4. pythonandroid自动化测试仪器_使用Python进行Android自动化测试
  5. 【渝粤题库】国家开放大学2021春1374班级管理题目
  6. 设置QtreeWidget水平滚动条
  7. C# 串口接收1次数据会进入2次串口接收事件serialPort1_DataReceived,第2次进入时串口缓冲区为空
  8. GridView模板问题
  9. manjaro 安装mysql_manjaro安装mysql5.7
  10. java ftl导出pdf_java根据模板导出PDF详细教程
  11. HDFS优缺点及解决方案
  12. Sqoop--全量/增量、导入/导出
  13. 快速迭代式开发使用方法总结
  14. 整理了一下以前写的东西,单条记载 现在看看还蛮有意思
  15. 渲染算法学习(七)-- Real-Time Ray Tracing
  16. 什么是冯诺依曼结构、哈佛结构、改进型哈佛结构?
  17. RK3568 VS RK3399
  18. 服务器微信服务号响应变慢,微信卡顿和响应慢,教大家轻松搞定:简单操作,赶快收藏分享吧...
  19. 计算机学院2022级新生邀请赛(二)
  20. php输出圆周率100位,圆周率1500多位

热门文章

  1. 有符号整型的数据范围为什么负数比正数多一个
  2. MPAndroidChart 3.0——BarChart(一)
  3. android barchart设置标题,android - 如何设置MPAndroidChart BarChart的高度和宽度? - 堆栈内存溢出...
  4. 显微镜下的大明内容_《显微镜下的大明》读后感
  5. 利用Excel批量快速发送电子邮件
  6. html显示空间图片,qq空间显示不出来 为什么QQ空间有些图片显示不了
  7. android ps1 变量配置,安卓ps模拟器ePSXe使用图文教程
  8. jQuery日常记录
  9. 【C# | Unity】B站Android客户端缓存视频提取工具
  10. jQuery boxy弹出层插件中文演示及讲解(转)