Java设计模式-组合模式

33 篇文章 1 订阅
订阅专栏

组合模式

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

组合模式的定义与特点

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

  组合模式的主要优点有:

  1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

  其主要缺点是:

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

组合模式的结构与实现

  组合模式的结构不是很复杂,下面对它的结构和实现进行分析。

1. 组合模式的结构

  组合模式包含以下主要角色。

  1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。
  2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
  3. 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含
    Add()、Remove()、GetChild() 等方法。

  组合模式分为透明式的组合模式和安全式的组合模式。

  (1) 透明方式:在该方式中,由于抽象构件声明了所有子类中的全部方法,所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,却要实现它们(空实现或抛异常),这样会带来一些安全性问题。其结构图如图所示。
透明式的组合模式的结构图
  (2) 安全方式:在该方式中,将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题,但由于叶子和分支有不同的接口,客户端在调用时要知道树叶对象和树枝对象的存在,所以失去了透明性。其结构图如图所示。
安全式的组合模式的结构图

2. 组合模式的实现

  假如要访问集合 c0={leaf1,{leaf2,leaf3}} 中的元素,其对应的树状图如下图所示。
集合c0的树状图
  透明式的组合模式的实现代码:

//TransparentComponentTest.java
package Composite;

import java.util.ArrayList;

/**
 * 透明式的组合模式
 */
public class TransparentComponentTest {

    public static void main(String[] args) {
        TransparentComponent c0 = new TransparentComposite();
        TransparentComponent c1 = new TransparentComposite();
        TransparentComponent leaf1 = new TransparentLeaf("1");
        TransparentComponent leaf2 = new TransparentLeaf("2");
        TransparentComponent leaf3 = new TransparentLeaf("3");
        c0.add(leaf1);
        c0.add(c1);
        c1.add(leaf2);
        c1.add(leaf3);
        c0.operation();
    }

}


//抽象构件
interface TransparentComponent {
    public void add(TransparentComponent c);

    public void remove(TransparentComponent c);

    public TransparentComponent getChild(int i);

    public void operation();
}

//树叶构件
class TransparentLeaf implements TransparentComponent {
    private String name;

    public TransparentLeaf(String name) {
        this.name = name;
    }

    public void add(TransparentComponent c) {
    }

    public void remove(TransparentComponent c) {
    }

    public TransparentComponent getChild(int i) {
        return null;
    }

    public void operation() {
        System.out.println("树叶" + name + ":被访问!");
    }
}

//树枝构件
class TransparentComposite implements TransparentComponent {
    private ArrayList<TransparentComponent> children = new ArrayList<TransparentComponent>();

    public void add(TransparentComponent c) {
        children.add(c);
    }

    public void remove(TransparentComponent c) {
        children.remove(c);
    }

    public TransparentComponent getChild(int i) {
        return children.get(i);
    }

    public void operation() {
        for (Object obj : children) {
            ((TransparentComponent) obj).operation();
        }
    }
}

  安全式的组合模式的实现代码:

package Composite;

import java.util.ArrayList;

/**
 * 安全式的组合模式
 */

public class SecurityComponentTest {

    public static void main(String[] args) {
        SecurityComposite c0 = new SecurityComposite();
        SecurityComposite c1 = new SecurityComposite();
        SecurityComponent leaf1 = new SecurityLeaf("1");
        SecurityComponent leaf2 = new SecurityLeaf("2");
        SecurityComponent leaf3 = new SecurityLeaf("3");
        c0.add(leaf1);
        c0.add(c1);
        c1.add(leaf2);
        c1.add(leaf3);
        c0.operation();
    }

}


//抽象构件
interface SecurityComponent {
    public void operation();
}

//树叶构件
class SecurityLeaf implements SecurityComponent {
    private String name;

    public SecurityLeaf(String name) {
        this.name = name;
    }

    public void operation() {
        System.out.println("树叶" + name + ":被访问!");
    }
}

//树枝构件
class SecurityComposite implements SecurityComponent {
    private ArrayList<SecurityComponent> children = new ArrayList<SecurityComponent>();

    public void add(SecurityComponent c) {
        children.add(c);
    }

    public void remove(SecurityComponent c) {
        children.remove(c);
    }

    public SecurityComponent getChild(int i) {
        return children.get(i);
    }

    public void operation() {
        for (Object obj : children) {
            ((SecurityComponent) obj).operation();
        }
    }
}

程序运行结果如下:

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

组合模式模式应用场景

  
前面分析了组合模式的结构与特点,下面分析它适用的以下应用场景。

  • 在需要表示一个对象整体与部分的层次结构的场合。
  • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

组合模式的扩展

  组合模式所包含的 4 个角色不是任何时候都要存在的,在有些应用环境下模式是可以简化的,如以下两种情况。

  如果对前面介绍的组合模式中的树叶节点和树枝节点进行抽象,也就是说树叶节点和树枝节点还有子节点,这时组合模式就扩展成复杂的组合模式了,如 Java AWT/Swing 中的简单组件 JTextComponent 有子类 JTextField、JTextArea,容器组件 Container 也有子类 Window、Panel。复杂的组合模式的结构图如下图所示。
复杂的组合模式的结构图

java常用设计模式-组合模式
08-26
java常用设计模式-组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中...
java设计模式-组合模式
02-27
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
Java特性之设计模式组合模式
Vinjcent
03-13 849
定义了组合中所有对象的通用接口,可以是抽象类或接口。它声明了用于访问和管理子组件的方法,包括添加、删除、获取子组件等。
JAVA设计模式-组合模式
CB_Beginner的博客
10-16 389
2.1、组合模式,又叫部分整体模式,它创建了对象组的树形结构。将对象组合成树状结构以表示“整体-部分”的层次关系2.2、组合模式依据树形结构来组合对象。用来表示部分以及整体层次2.3、这种类型的设计模式属于结构型模式2.4、组合模式使得用户对单个对象和组合对象的访问具有一致性即:组合能让客户以一致的方式处理个别对象以及组合对象2、Leaf;在组合中表示叶子节点,叶子节点没有子节点3、Composite:非叶子节点,用户存储子部件, 在Component接口中实现子部件的相关操作,比如增加,删除。
14、java设计模式--组合模式
最新发布
zht245648124的博客
04-27 929
​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。
设计模式组合模式
weixin_64366370的博客
05-06 1789
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
设计模式第13讲——组合模式(Composite)
让~学习~成为一种习惯(橡 皮 人の技术博客)
06-20 2934
组合模式也成为整体部分模式,是一种结构型设计模式。一、什么是组合模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 UML类图 5.1 Expression-组件(Component)5.2 Number-叶子节点(Leaf)5.3 Operation-组合节点(Composite)5.4 testComposite六、总结
组合设计模式
大树
04-06 1292
组合设计模式 一、组合设计模式 1、介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构。将对象组合成树状结构以表示“整体-部分”的层次关系 组合模式依据树形结构来组合对象,用来表示部分以及整体层次 组合模式属于结构型模式 组合模式使得用户对单个对象和组合对象的访问具有一致性。即:组合能让客户以一致的方式处理个别对象以及组合对象 2、原理UML类图 Component:这是组合中对象声明接口,定义或实现公共有的接口默认行为,用于访问和管理Component
JAVA-设计模式-结构型模式-组合模式
08-10
JAVA-设计模式-结构型模式-组合模式
Java设计模式-建造者模式详解
11-24
Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...
Java设计模式-图解-附代码.doc
09-19
在软件工程中,设计模式是一种被广泛接受的解决特定设计问题的...因此,深入学习和理解Java设计模式对于任何Java开发者来说都是至关重要的。通过文档中的图解和代码示例,读者可以更好地理解和掌握这些模式的实际应用。
设计模式组合模式示例
学者的博客
11-19 2528
组合模式简介 组合模式(Composite Pattern),就是同一类型的对象像一棵树一样聚焦在一起。就像下图一样。图中一个结点对应一个类的实例。图中的箭头是“组成关系”,即某个结点内部包含了指向的所有结点。 如果翻译成类图,就像下图一样 。 SubComponent就是上图中的Branch,它包含多个Component,也就是说,SubComponent既可以包含SubComponent,又...
【结构型模式】组合模式
一键一键敲代码
12-29 226
文章目录前言(一些废话,可以忽略)要解决的问题组合模式总结附录代码 前言(一些废话,可以忽略) 组合模式,是我们依赖关系中的一种,在这里又变换成为一种设计模式,那么它的核心肯定也是将类与类通过组合的方式拼凑在一起了 PS.部分类实现见文末 要解决的问题 我们都知道一个单位,有组织架构,一个学校有各个不同的院系,一个院系又有不同的部门,那么我们式样哪种方式来方便扩展的,符合代码设计原则的方式来...
java组合模式
王朝虎的博客
01-23 1439
组合模式介绍使用场景优点表现形式实例 下面是正文 介绍 组合模式使用户对单个对象和组合对象的使用具有一致性。 屏蔽了容器对象与单个对象在使用时的差异,为客户提供统一的操作接口,从而降低客户代码与被调用对象的耦合关系,方便系统维护与扩展。 使用场景 当需求中体现部分与整体层次结构时,以及希望用户可以忽略组合对象与单个对象不同时,统一德使用组合结构中的所有对象时,可考虑使用组合模式。 优点 组合模...
JAVA组合模式应用-树形结构
七两雨
05-21 2630
目录结构、组织架构这类问题都可以使用组合模式解决package com.mkf.pattern; import java.util.Enumeration; import java.util.Vector; public class TreeNode { private String name; private TreeNode parent; private Vector childr
JAVA组合模式
热门推荐
帅哥威的博客
08-24 2万+
JAVA组合模式 通过本文将学习到 Table of Contents 1、组合模式的概念 2、组合模式的UML图 3、组合模式的实现 4、组合模式的优缺点 5、组合模式适用场景 6、总结 7、关于最近一些事。   红色代表重点,黑色代表废话!蓝色觉得好看。 1、组合模式的概念 组合模式:组合多个对象形成树形结构以表示有整体-部分关系层次结构,组合模式可以让客户端统...
结构型模式之——组合模式
Mr.LongFace Blog
08-18 4424
结构型模式之 组合模式 前言 模式定义 模式结构 UML类图 适用场景 在以下情况下可以使用组合模式 看看大神怎么用 高清有码 总结 感谢结构型模式之 组合模式前言对于树形结构,在代码中有容器节点和叶子节点之分,容器节点可以有子节点,而叶子节点没有,所以两者是有区分的,而在实际使用中,我们更希望一致的对待他们,因为如若区别对待,在程序上会非常复杂。组合模式则是为了解决此类问题而生的,它可以让叶子对象
java设计模式组合模式(Composite)
heidou_2016的博客
11-21 361
在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。 组合模式的定义与特点 组合(Composite)模式的定义:有时又叫作部分-整体...
图解Java设计模式-23种设计模式
08-28
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method ...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Java设计模式-合成复用原则 17005
  • Java设计模式-迪米特法则 14728
  • Java设计模式-里氏替换原则 9116
  • Java设计模式-接口隔离原则 8882
  • Java设计模式-模板方法模式 8737

分类专栏

  • Java设计模式 10篇
  • Java 33篇
  • java架构
  • 大数据

最新评论

  • Java设计模式-桥接模式

    天蓝999: 可以的,我看的另一个神仙级Java设计模式实战,它结合SpringBoot,我彻底学会了Java设计模式及应用,见:https://knife.blog.csdn.net/article/details/131900171

  • 简单方式查看类的继承关系

    一条游向寒江的鱼: 言简意赅,条理清晰,受益匪浅

  • Java设计模式-接口隔离原则

    张三王五: 博主讲的很好很不错

  • Java设计模式-合成复用原则

    m0_51026854: 请问没有代码嘛

  • Java设计模式-里氏替换原则

    zxguan: 各个版本的说明真是让人头大,真该把写博客的人都拉回去上一遍1~9年级的语文,好好学学表达方式!--!

大家在看

  • 图像分割(二)——低照度下自然场景下图像分割的一种新方法 943
  • 基于Typora、Gitee和picgo搭建图床 2247
  • 前端破局必看,前端不看后悔
  • 太好用了!免费且无限换脸,还支持数字人的神奇工具(附安装包) 681
  • 【数据结构与算法】稀疏矩阵(三元组,十字链表存储)详解

最新文章

  • Java设计模式-原型模式
  • Java设计模式-单例模式
  • Java设计模式-解释器模式
2019年33篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司海口百度网站优化公司海西SEO按天扣费多少钱固原推广网站临猗网站优化按天扣费推荐揭阳品牌网站设计多少钱宜昌百姓网标王公司毕节seo网站优化丹竹头百姓网标王多少钱固原网站搜索优化哪家好包头百度网站优化排名报价长治百度网站优化公司南澳百搜标王平湖优化价格黔南SEO按效果付费陇南网站搜索优化多少钱酒泉品牌网站设计哪家好醴陵网站优化按天计费报价周口百姓网标王推广价格泉州seo网站优化推荐木棉湾建网站多少钱锦州至尊标王公司驻马店seo价格定西至尊标王公司昭通百搜标王公司金华网站关键词优化价格资阳百姓网标王推广报价北京SEO按效果付费公司广东百度竞价包年推广多少钱坪地外贸网站建设推荐庆阳SEO按效果付费多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化