设计模式笔记(9)---组合模式(结构型)

设计模式之结构型模式 结构型模式 一、适配器模式 (一)定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。 (二)应用实例:读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 (三)构成要素: 二、桥接模式 (一)定义:桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 阅读详情

Gof定义

将对象组合成树形结构以表示“部分--整体”的层次结构。Composite使得用户对单个对象和组合对象使用具有一致性。

在面向对象系统中,我们经常会遇到一类具有”容器“特征的对象---即他们在充当对象的同时,又是其他对象的容器。比如在一些管理系统中就会出现总公司下面有很多的分公司,分公司下面有很多的部门,每个部门下又有很多的员工,像分公司和部门就是既充当了“对象”的角色也充当了“容器”的角色;还有我们可能玩过的“俄罗斯套娃”也是这种结构,一个大娃娃里面装个小娃娃,小的里面又有个小的直到最小的一个,中间的娃娃就是既充当了“对象”也充当了“容器”。先看下面这个例子:

interface IBox
{
    void Process();
}
/// <summary>
/// 相当于树的叶子节点,没有子对象了
/// </summary>
public class SingleBox : IBox
{
    public void Process()
    { 
    
    }
}
/// <summary>
/// 容器
/// </summary>
public class ContainerBox : IBox
{
    List<IBox> list = new List<IBox>();
    public void Process() { }
    public List<IBox> GetBoxes()
    {
        return list;
    }
}
/// <summary>
/// 客户代码
/// </summary>
public class App
{
    static void Mina()
    {
        ///此处从工厂方法中得到盒子的对象,但我们不知道是SingleBox还是ContainerBox
        ///所以要做判断
        IBox box = Factory.Create();
        if (box is ContainerBox)
        {
            box.Process();
            List<IBox> list = ((ContainerBox)box).GetBoxes();
        }
        else if(box is SingleBox)
        {
            box.Process();
        }
    }
}

动机

上面代码的问题的根据在于:客户代码过多地依赖对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。

如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

这就要使用Composite模式了,先看下Composite模式的结构图

2009-11-24_073228

Component:定义了Leaf和Composite的一些共有特性。

Composite:有容器特征的类型。

Leaf:叶节点,即一个单独的个体,下面没有子节点。

依据上面的结构图完成代码实现:

public abstract class Component
{
    protected string _name;
    public Component(string name)
    {
        _name = name;
    }
    public abstract void Operation();
    public abstract void Add(Component component);
    public abstract void Remove(Component component);
}

public class Leaf : Component
{
    public Leaf(string name) : base(name) { }
    public override void Add(Component component)
    {
        throw new NotSupportedException();
    }
    public override void Remove(Component component)
    {
        throw new NotSupportedException();
    }

    public override void Operation()
    { 
        //...do something
    }
}

public class Composite : Component
{
    public Composite(string name):base(name){}
    List<Component> list = new List<Component>();
    /// <summary>
    /// 添加
    /// </summary>
    /// <param name="conponent"></param>
    public override void Add(Component component)
    {
        if (list != null)
        {
            list = new List<Component>();
        }
        list.Add(component);
    }
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="component"></param>
    public override void Remove(Component component)
    {
        if (list == null)
        {
            throw new NullReferenceException();
        }
        list.Remove(component);
    }

    public override void Operation()
    {
        if (list != null)
        {
            foreach (Component c in list)
            {
                c.Operation();
            }
        }
    }
}

Leaf类为叶子节点类,它的实例是没有子节点的,但是在抽象类中的方法Add和Remove方法必须要实现,按理说这样的实现是没有意义的,所以在此处抛出了NotSupportedException 异常,在客户端调用捕获到再做相应的处理,这种模式称之为“透明足组合模式”,这样做的好处是叶子(Leaf)和容器(Composite)对于外界没有分别,它们具有一致的接口行为。还有一种情况叫“安全组合模式”,在抽象类(Component)中不定义Add Remove方法,而是在容器的实现类中去定义,这样就各司其职了,看下面结构图

2009-11-24_232154

代码实现

public abstract class Component
{
    protected string _name;
    public Component(string name)
    {
        _name = name;
    }
    public abstract void Operation();
}

public class Leaf : Component
{
    public Leaf(string name) : base(name) { }

    public override void Operation()
    {
        //...do something
    }
}

public class Composite : Component
{
    public Composite(string name) : base(name) { }
    List<Component> list = new List<Component>();
    /// <summary>
    /// 添加
    /// </summary>
    /// <param name="conponent"></param>
    public void Add(Component component)
    {
        if (list != null)
        {
            list = new List<Component>();
        }
        list.Add(component);
    }
    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="component"></param>
    public void Remove(Component component)
    {
        if (list == null)
        {
            throw new NullReferenceException();
        }
        list.Remove(component);
    }

    public override void Operation()
    {
        if (list != null)
        {
            foreach (Component c in list)
            {
                c.Operation();
            }
        }
    }
}

使用“安全组合模式”Leaf和Composite就不具有相同的接口,所以在客户端调用的时候还是要去判断是什么类型,比较麻烦。所以说选择哪种还要看具体的需求。

Composite模式的几个要点

Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象还是组合的对象容器。

将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思>想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。

Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。

Composite模式在具体实现中,可以让父对象中的子对象反向追溯; 如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。

【技术纵览】行为识别前沿模型演进:从CNN到多模态大模型 本文全面解析了行为识别技术从CNN到多模态大模型的演进历程,重点介绍了SlowFast、TimeSformer、VideoMAE和InternVideo等SOTA模型的核心创新与应用实践。通过对比分析各代模型在Kinetics-400等数据集上的表现,揭示了自监督学习和多模态融合如何推动行为识别准确率突破85%,并探讨了工业部署中的技术选型策略与优化方向。 阅读详情

相关推荐

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

纯CSS实现蜂窝六边形的个性相册

概述 纯CSS实现蜂窝六边形的个性相册 详细 代码下载:http://www.demodashi.com/demo/12804.html 此案例主要用到CSS3的 transform 和 transition属性,还有nth-child() 选择器 一、准备工作 1、主要运用到CSS3的3D transform变换   transform:向元素应用 2D 或 3D 转换。...

weixin_34179968的博客 1002

UVM验证中,为什么我的pack_bytes()返回长度是0?手把手教你排查自定义do_pack函数

本文深入解析UVM验证中pack_bytes()返回长度为0的常见原因及系统排查方法。从UVM打包机制原理出发,详细列举了super.do_pack()缺失、field automation冲突等典型问题,并提供动态数组处理、位宽计算等进阶调试技巧,帮助开发者快速定位和解决自定义do_pack函数问题。

weixin_42523693的博客 127

设计模式学习笔记三:结构型模式(Structural Pattern)

声明:学习内容均来自《设计模式的艺术》这本书。

itman1010的博客 1658

LabVIEW数据采集-数字I/O/计数器

labview 数据采集 数字I/O 计数器

weixin_43781045的博客 5619

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2574

设计模式学习笔记 --- 9.组合模式

组合模式(Composite Pattern),又叫部分整体模式,适用于把一组相似的对象当作一个单一的对戏那个。组合模式依据树形结构来组合对象,用来表述部分遗迹整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构; 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式; 意图:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用...

杨鑫newlife的专栏 516

Zemax非序列模式微透镜阵列仿真:从建模到优化完整指南

光线追迹是光学系统仿真的核心技术,其原理基于几何光学与物理光学的光线传播模型,通过精确计算光线在光学元件中的折射、反射与散射路径,实现对系统性能的预测与评估。在微透镜阵列等复杂多通道光学系统中,传统序列模式因光线路径受限而难以准确模拟串扰与杂散光,非序列光线追迹技术则凭借其灵活的空间传播机制成为关键手段。该技术广泛应用于激光整形、光束匀化、3D传感及光场成像等领域,能够有效支持阵列结构设计与优化。Zemax非序列模式为微透镜阵列仿真提供了完整的建模、优化与公差分析流程,是光学工程师进行复杂系统设计的核心工具

weixin_29967003的博客 334

C#设计模式学习笔记:(9)组合模式

本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7743118.html,记录一下学习过程以备后续查用。 一、引言 今天我们要讲结构型设计模式的第四个模式–组合模式。当我们谈到这个模式的时候,有一个物件和这个模式很像,那就是“俄罗斯套娃”。“俄罗斯套娃”是 大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的那个瓷器娃娃为止。在我们 的操作系统中有文件夹的概念,文件夹可以包含文件夹并可以嵌套多层,这个和“俄罗

chinaherolts2008的博客 343

activemq_CVE-2015-5254_漏洞复现_源码分析

ActiveMQ-CVE-2015-5254

qq_51550750的博客 940

YOLOv8改进 | Conv篇 | 利用YOLO-MS的MSBlock轻量化网络结构(既轻量又长点)

本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块,我们将其用于C2f中组合出一种新的结构,来替换我们网络中的模块可以达到一种轻量化的作用,我将其用于我的数据集上实验,包括多个类别的数据集,其在轻量网络结构的同时,却能够提高一定的mAP精度,所以这是一种十分高效的模块,该网络结构非常适合那些模型精度已经无法提到,想要从轻量化模型的角度入手的读者使用。欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。

Snu77的博客 6094

设计模式学习笔记:组合模式(Composite)

文章目录一、组合模式简介二、组合模式的作用三、组合模式的应用四、示例演示组合模式结构图代码示例测试代码 努力才会收获成功,不努力只能永远羡慕别人。 一、组合模式简介 组合模式是设计模式中结构型模式的一种。它表示了一种将相似对象组合成树状结构的“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 二、组合模式的作用 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶

爱辰 549

SI案例分享--PCB通孔互连新技术的应用(VeCS)

本文介绍了VeCS的物理结构和制造过程,并通过全波仿真模拟和测量,分析了VeCS的电性能,并与传统的测量方法进行了比较。结果表明,由于有一个连续的参考平面,VeCS的TDR阻抗可以很容易地控制到目标阻抗,同时可以大大减轻信道上的串扰,的确是一种性能不错的PCB互连创新设计方案。

一只豌豆象的博客 2116

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

本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试。 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习。 文章目录设计模式-23种设计模式之结构型模式设计模式分类设计模式介绍创建型模式结构型模式行为型模式结构型模式适配器模式引入概念对象适配器模型结构图示例代码类适配器模型结构图示例代码缺省适配器引入概念示例代码模式优点模式缺点使用场景最佳示例装饰器模式概念模型结构图示例代码模式优点模式缺点使用场景最佳示例JDK的I

weixin_44414492的博客 2330

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

2.设计模式_02_结构型设计模式

本文摘要主要介绍了GoF 23种设计模式的分类以及代理模式的实现方式。设计模式分为创建型(5种)、结构型(7种)和行为型(11种)三大类。重点阐述了代理模式的概念、应用场景及实现方式,包括静态代理和动态代理。静态代理部分详细说明了硬编码方案和继承方案的优缺点,并通过订单系统的案例展示了如何在不修改源代码的情况下通过代理模式实现性能监控功能。代理模式在需要保护目标对象、增强功能或复用代码时非常有用,是软件开发中常用的重要设计模式。

u011488477的博客 1255

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【学习笔记】设计模式-组合模式(Composite)

文章目录0 设计模式1 组合模式2 实现思路3 需要的类4 具体实现4.1 Node4.2 BranchNode4.3 LeafNode4.4 测试类5 思维导图6 示例源码地址最后 0 设计模式 不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式 https://blog.csdn.net/qq_42874315/article/details/120006447?spm=1001.2014.3001.5502 1 组合模式 组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。

五条的博客 274

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

解锁结构型设计模式:架构师的必备秘籍

本文系统介绍了七种结构型设计模式及其应用。适配器模式通过接口转换实现不兼容类的协同工作;装饰器模式动态扩展对象功能;代理模式控制对象访问;外观模式简化复杂子系统调用;桥接模式分离抽象与实现;组合模式构建树形层次结构;享元模式共享细粒度对象以优化性能。文章通过具体代码示例展示了各模式的实现方式,并分析了实际应用场景,如电商系统、游戏开发、图形渲染等领域。最后指出,在人工智能、大数据等新兴技术背景下,结构型设计模式将持续发挥重要作用,并建议通过经典书籍、开源项目和实践来深入掌握这些模式。

大雨淅淅的博客 831

组合模式【Java设计模式】

组合模式【Java设计模式】

小心星的博客 283

《设计模式》学习笔记整理手册

文章目录一、GoF设计模式的分类1.1 创建型1.2 结构型1.3 行为型二、设计原则概述2.1 面向对象设计原则概述:2.2 单一职责原则2.3 开闭原则2.4 里氏代换原则2.5 依赖倒转原则2.6 接口隔离原则2.7 合成复用原则2.8 迪米特法则三、创建型设计模式3.1 抽象工厂模式3.1.1 模式定义3.1.2 模式角色3.1.3 简单例子3.1.4 抽象工厂模式和工厂模式的区别3.2 ...

Nicky's blog 4923

自学与复习设计模式笔记(9)组合模式

自学与复习设计模式笔记(9)组合模式

一木一白_ 194

【Java学习】Java设计模式——24种设计模式笔记整理

24种设计模式笔记整理,24种设计模式可以分为结构型模式、行为型模式和创造型模式

一棵灬大树的博客 2569

设计模式笔记--组合模式

设计模式笔记--组合模式

bihansheng2010的博客 7016
上一篇: 设计模式笔记(8)---桥接模式(结构型)
下一篇: 设计模式笔记(10)---装饰模式(结构型)
oec2003
博客等级 码龄20年 373粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值