乐在其中设计模式(C#) - 组合模式(Composite Pattern)

【愚公系列】二十三种设计模式(八)-组合模式(Composite Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情
[索引页]
[源码下载]


乐在其中设计模式(C#) - 组合模式(Composite Pattern)


作者: webabcd


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


示例
有一个Message实体类,使其单个对象和复合对象具有一致性。



MessageModel
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Composite
{
    
/// <summary>
    
/// Message实体类
    
/// </summary>

    public class MessageModel
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="msg">Message内容</param>
        
/// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)
        
{
            
this._message = msg;
            
this._publishTime = pt;
        }


        
private string _message;
        
/// <summary>
        
/// Message内容
        
/// </summary>

        public string Message
        
{
            
get { return _message; }
            
set { _message = value; }
        }


        
private DateTime _publishTime;
        
/// <summary>
        
/// Message发布时间
        
/// </summary>

        public DateTime PublishTime
        
{
            
get { return _publishTime; }
            
set { _publishTime = value; }
        }

    }

}


MessageModelComponent
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Composite
{
    
/// <summary>
    
/// 抽象Message实体构件(Component)
    
/// </summary>

    public abstract class MessageModelComponent
    
{
        
/// <summary>
        
/// Message实体对象
        
/// </summary>

        protected MessageModel _messageModel;

        
/// <summary>
        
/// 名称
        
/// </summary>

        protected string _name;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="name">名称</param>
        
/// <param name="mm">Message实体对象</param>

        public MessageModelComponent(string name, MessageModel mm)
        
{
            
this._name = name;
            
this._messageModel = mm;
        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="name">名称</param>

        public MessageModelComponent(string name)
        
{
            
this._name = name;
        }


        
/// <summary>
        
/// 添加
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public abstract void Add(MessageModelComponent mmc);

        
/// <summary>
        
/// 删除
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public abstract void Remove(MessageModelComponent mmc);

        
/// <summary>
        
/// 获取
        
/// </summary>
        
/// <param name="indent">缩进数</param>
        
/// <returns></returns>

        public abstract string GetData(int indent);
    }

}


MessageModelLeaf
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Composite
{
    
/// <summary>
    
/// Message实体树叶(Leaf)
    
/// </summary>

    public class MessageModelLeaf : MessageModelComponent
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="name">名称</param>
        
/// <param name="mm">Message实体对象</param>

        public MessageModelLeaf(string name, MessageModel mm)
            : 
base(name, mm)
        
{
            
        }


        
/// <summary>
        
/// 添加
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public override void Add(MessageModelComponent mmc)
        
{
            
throw new Exception("不能添加");
        }


        
/// <summary>
        
/// 删除
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public override void Remove(MessageModelComponent mmc)
        
{
            
throw new Exception("不能删除");
        }


        
/// <summary>
        
/// 获取
        
/// </summary>
        
/// <param name="indent">缩进数</param>
        
/// <returns></returns>

        public override string GetData(int indent)
        
{
            
return new String('—', indent) + 
                
"树叶名称:" + _name + 
                
";信息内容:" + _messageModel.Message + 
                
"<br />";
        }

    }

}


MessageModelComposite
using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Pattern.Composite
{
    
/// <summary>
    
/// Message实体树枝(Composite)
    
/// </summary>

    public class MessageModelComposite : MessageModelComponent
    
{
        
private List<MessageModelComponent> _list;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="name">名称</param>

        public MessageModelComposite(string name)
            : 
base(name)
        
{
            _list 
= new List<MessageModelComponent>();
        }


        
/// <summary>
        
/// 添加
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public override void Add(MessageModelComponent mmc)
        
{
            _list.Add(mmc);
        }


        
/// <summary>
        
/// 删除
        
/// </summary>
        
/// <param name="mmc">MessageModelComponent</param>

        public override void Remove(MessageModelComponent mmc)
        
{
            _list.Remove(mmc);
        }


        
/// <summary>
        
/// 获取
        
/// </summary>
        
/// <param name="indent">缩进数</param>
        
/// <returns></returns>

        public override string GetData(int indent)
        
{
            
string s = new String('—', indent) + 
                
"树枝名称:" + _name + 
                
"<br />";

            
foreach (MessageModelComponent mmc in _list)
            
{
                s 
+= mmc.GetData(indent + 2);
            }


            
return s;
        }

    }

}



Test
using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  Pattern.Composite;

public  partial  class  Composite : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        MessageModelComposite root 
= new MessageModelComposite("树枝A");

        root.Add(
new MessageModelLeaf("树叶A", new MessageModel("Message内容A", DateTime.Now)));
        root.Add(
new MessageModelLeaf("树叶B", new MessageModel("Message内容B", DateTime.Now)));

        MessageModelComposite comp 
= new MessageModelComposite("树枝B");

        comp.Add(
new MessageModelLeaf("树叶C", new MessageModel("Message内容C", DateTime.Now)));
        comp.Add(
new MessageModelLeaf("树叶D", new MessageModel("Message内容D", DateTime.Now)));

        root.Add(comp);

        root.Add(
new MessageModelLeaf("树叶E", new MessageModel("Message内容E", DateTime.Now)));

        MessageModelLeaf l 
= new MessageModelLeaf("树叶F", new MessageModel("Message内容F", DateTime.Now));
        
        root.Add(l);
        root.Remove(l);

        Response.Write(root.GetData(
1));
    }

}


运行结果
—树枝名称:树枝A
———树叶名称:树叶A;信息内容:Message内容A
———树叶名称:树叶B;信息内容:Message内容B
———树枝名称:树枝B
—————树叶名称:树叶C;信息内容:Message内容C
—————树叶名称:树叶D;信息内容:Message内容D
———树叶名称:树叶E;信息内容:Message内容E


参考
http://www.dofactory.com/Patterns/PatternComposite.aspx


OK
[源码下载]
基于 STM32 的乒乓球发球机控制系统设计与实现 乒乓球发球机是一种能够按照预设参数自动、连续发出乒乓球的训练设备。本系统以 STM32F103C8T6 为主控核心,通过控制实现球速调节、实现落点与旋转方向控制、实现出球节奏控制,并配合 OLED 显示与按键人机交互,实现速度、频率、落点、旋转四大参数的可调发球训练。 阅读详情

相关推荐

一体化伺服电机与施耐德PLC TM241CEC24T在Canopen协议下的应用

一.硬件组成 软件组成:施耐德SoMachineV4.3二.○1.打开SoMachineV4.3,点击“新建项目”○2.点击“空白项目”○3.项目命名○4.点击“创建项目” 三. 点击“Logic Builder” 四. ○1.右击项目”PMM_CANOPEN_ST”添加设备○2.点击”LogicController”选择PLC型号TM241CEC24T/U○3.点击“添加设备” 五. ○1.右击CAN_1,添加设备○2.选择“CANopen Perfomance”○3.点击“添加设备”

m0_46512607的博客 2520

【C#设计模式】9.组合模式(Composite Pattern)【结构型】

1.1 动机(Motivate) 客户代码过多地依赖于对象容器(对象容器是对象的容器,细细品味)复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等方面的弊端。如何将“客户代码与复杂的对象容器结构”解耦?如何让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器? 1.2 意图(Intent) 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一..

星Yeah 的博客 2970

在 Windows 10 中通过 WSL2 安装 vLLM 部署本地大模型的方法和步骤

通过 WSL2 在 Windows 10 中部署 vLLM 的核心优势是兼顾 Windows 生态与 Linux 环境的 GPU 加速能力,适合需要在 Windows 下开发但依赖 vLLM 高性能推理的场景。相比原生 Windows 部署(Ollama 等工具),该方案性能更优(接近原生 Ubuntu),且支持更大模型和量化优化。若追求极致性能,建议直接使用 Ubuntu 系统;若必须依赖 Windows 工具链,WSL2 + vLLM 是当前最优选择。

当 AI 开始写文章、绘星空,甚至预测未来,您还在旁观吗?这里将剖开人工智能的思考逻辑,拆解 AI 创作的底层密码,也聊聊人工智能里的人文温度。每篇都有让你拍案的细节,快来解锁 AI 时代的神奇世界! 3753

C#设计模式读书笔记之组合模式(Composite Pattern)

组合模式(Composite Pattern)【使用频率:★★★★☆】 1. 概述   组合多个对象形成树形结构,以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。 组合模式的关键是定义了一个抽象组件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象组件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。...

qq826364410的专栏 367

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1948

保姆级教程:用Docker Compose一键部署WVP-PRO+ZLM+录像服务(含Nginx反代)

本文提供了一套完整的容器化GB28181视频平台部署方案,通过Docker Compose实现WVP-PRO、ZLMediaKit(ZLM)和录像服务的一键式部署。详细介绍了环境准备、架构设计、容器化部署实战以及高级配置优化,帮助用户快速搭建高性能视频监控管理平台,适用于安防行业和物联网设备管理场景。

weixin_30415113的博客 861

C# 设计模式:第九章 - 结构型模式 之 组合模式(Composite Pattern)

在这章中,我们学习了组合模式的基本概念、应用场景、实现方法以及注意事项。组合模式提供了一种将对象组合成树形结构的方式,使得用户对单个对象和组合对象的使用具有一致性。它在表示层次化的数据结构方面有着重要的作用,如文件系统、组织结构、图形界面等。我们通过两个实际的代码示例展示了如何在 C# 中实现组合模式,包括基本的组合模式和文件系统的应用。最后,我们还讨论了一些使用组合模式时需要注意的地方,帮助你在实际开发中做出明智的选择。

caifox的博客 1202

固定效应模型-以stata为工具

固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学和健康研究中被广泛应用。

侯小啾技术博客 2837

组合模式-Composite Pattern

目录 组合模式的定义与特点 组合模式的结构与实现 组合模式的应用实例 组合模式的应用场景 组合模式的扩展 树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中...

心猿意碼 6491

【python数据挖掘课程】二十八.基于LDA和pyLDAvis的主题挖掘及可视化分析

这是《Python数据挖掘课程》系列文章,前面很多文章都讲解了数据挖掘、机器学习,这篇文章主要讲解LDA和pyLDAvis算法,同时讲解如何读取CSV文本内容进行主题挖掘及可视化展示。文章比较基础,希望对你有所帮助,提供些思路,也是自己教学的内容。推荐大家购买作者新书《Python网络数据爬取及分析从入门到精通(分析篇)》,如果文章中存在错误或不足之处,还请海涵。 目录: 一.显示结果及安装 二.LDA主题挖掘 三.pyLDAvis可视化分析 四.小结

杨秀璋的专栏 1万+

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1234

组合模式(Composite Pattern)

设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) C#设计模式(11)-Composite Pattern 一、 合成(Composite)模式 合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。 从和尚的

jiangxinyu的专栏 2667

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 461

C#设计模式:组合模式(Composite Pattern)

一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _9.组合模式 { //组合模式主要用来...

dcujcivw769565的博客 158

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

组合模式(Composite Pattern)

组合模式(Composite Pattern)

明明明的博客 1128

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C#设计模式(10)——组合模式(Composite Pattern)

转载地址 一、引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象。然而组合模式就是解决这样的问题。下面让我们看看组合模式是怎样解决这个问题的。 二、组合模式的详细介绍 2.1 组合模式的定义 组合模式允

波波诸葛伟 661

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【23种设计模式】之组合模式(Composite Pattern) .Net Core实现

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 572

组合模式(Composite Pattern)——C#设计模式十

原文地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 原文作者:Learning hard 一、引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区...

U3D开发 193

Composite Pattern(组合模式)

对组合模式的学习、理解和应用案例

我与岁月的森林的博客 234
上一篇: 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
下一篇: 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值