c#设计12星座速配软件_C#设计模式(12)——组合模式

阅读目录

1.组合模式

在软件开发中我们经常会遇到处理部分与整体的情况,如我们经常见到的树形菜单,一个菜单项的子节点可以指向具体的内容,也可以是子菜单。类似的情况还有文件夹,文件夹的下级可以是文件夹也可以是文件。举一个例子:一个公司的组织架构是这样的,首先是总公司,总公司下边有直属员工和各个部门,各个部门下边有本部门的子部门和员工。我们去怎么去获取这个公司的组织架构呢(就是有层次地遍历出公司的部门名和员工名)?

组合模式可以很好地解决这类问题,组合模式通过让树形结构的叶子节点和树枝节点使用同样的接口,结合递归的思想来处理部分与整体关系,这种方式模糊了简单对象(叶子)和对象组(树枝)间的概念,让我们可以像处理单个对象一样去处理对象组。

树叶和树枝都要使用相同的接口,所以先创建一个抽象类,其内部定义了树枝和树叶的公共接口:

///

/// 抽象部件 定义了树枝和树叶的公共属性和接口

///

public abstract class Component

{

public string name;

public Component(string name)

{

this.name = name;

}

//添加子节点

public abstract void Add(Component c);

//删除子节点

public abstract void Remove(Component c);

//展示方法,dept为节点深度

public abstract void Display(int dept);

}

员工类,相当于树叶,没有下一级:

//具体员工,树形结构的Leaf

public class Employee : Component

{

public Employee(string name):base(name)

{

this.name = name;

}

//Leaf不能添加/删除子节点所以空实现

public override void Add(Component c)

{

}

public override void Remove(Component c)

{

}

public override void Display(int dept)

{

Console.WriteLine(new string('-', dept)+name);

}

}

部门类,相当于树枝,下边的节点可有有子部门,也可以有员工:

///

/// 部门类,相当于树枝

///

public class Depart : Component

{

public Depart(string name) : base(name)

{

this.name = name;

}

//添加子节点

public List children=new List();

public override void Add(Component c)

{

children.Add(c);

}

//删除子节点

public override void Remove(Component c)

{

children.Remove(c);

}

//展示自己和和内部的所有子节点,这里是组合模式的核心

public override void Display(int dept)

{

Console.WriteLine(new string('-',dept)+name);

foreach (var item in children)

{

//这里用到了递归的思想

item.Display(dept + 4);

}

}

}

客户端调用:

class Program

{

static void Main(string[] args)

{

Component DepartA = new Depart("A总公司");

Component DepartAX = new Depart("AX部门");

Component DepartAY = new Depart("AY部门");

Component DepartAX1 = new Depart("AX1子部门");

Component DepartAX2 = new Depart("AX2子部门");

Component Ae1 = new Employee("公司直属员工1");

Component AXe1= new Employee("AX部门员工1");

Component AX1e1= new Employee("AX1部门员工1");

Component AX1e2= new Employee("AX1部门员工2");

Component AYe1= new Employee("AY部门员工1");

Component AYe2= new Employee("AY部门员工2");

DepartA.Add(Ae1);

DepartA.Add(DepartAX);

DepartA.Add(DepartAY);

DepartAX.Add(AXe1);

DepartAX.Add(DepartAX1);

DepartAX.Add(DepartAX2);

DepartAX1.Add(AX1e1);

DepartAX1.Add(AX1e2);

DepartAY.Add(AYe1);

DepartAY.Add(AYe2);

//遍历总公司

DepartA.Display(1);

Console.ReadKey();

}

}

运行结果如下:

上边的例子中部门类中包含了一个List children,这个List内部装的是该部门的子节点,这些子节点可以是子部门也可以是员工,在部门类的Display方法中通过foreach来遍历每一个子节点,如果子节点是员工则直接调用员工类中的Display方法打印出名字;如果子节点是子部门,调用部门类的Display遍历子部门的下级节点,直到下级节点只有员工或者没有下级节点为止。这里用到了递归的思想。

2.小结

上边例子的类图

组合模式的使用场景:当我们处理部分-整体的层次结构时,希望使用统一的接口来处理部分和整体时使用。

组合模式的优点:在树形结构的处理中模糊了对象和对象组的概念,使用对象和对象组采用了统一的接口,让我们可以像处理简单对象一样处理对象组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hibernate与jpa_将JPA Hibernate与OptaPlanner集成

hibernate与jpa我们一直在改进OptaPlanner与JEE其余部分的集成,因此更容易构建可以正常工作的最终用户应用程序。 让我们看一下改进的JPA Hibernate集成。 基础 JPA Hibernate和OptaPlanner都可以在POJO(普通的旧Java对象)上工作&#xff0c…

程序如何运行,编译、链接、装入?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是…

python举两种字符串引号的例子_python里的单引号和双引号的有什么作用

在Python当中表达字符串既可以使用单引号,也可以使用双引号,那两者有什么区别吗?python单引号和双引号的区别简单来说,在Python中使用单引号或双引号是没有区别的,都可以用来表示一个字符串。但是这两种通用的表达方式…

枚举对象注释_如何以及何时使用枚举和注释

枚举对象注释本文是我们名为“ 高级Java ”的学院课程的一部分。 本课程旨在帮助您最有效地使用Java。 它讨论了高级主题,包括对象创建,并发,序列化,反射等。 它将指导您完成Java掌握的旅程! 在这里查看 !…

background 互联网图片_cssbackground-image和layer-background-image的区别

layer-background-image语法:layer-background-image : none | url (url)参数:none :  无背景图url :  使用绝对或相对地址指定背景图像说明:设置或检索对象整个区域的背景图像。示例:code {position: absolute;top: 100px; lef…

纪事本 乱码_纪事日记–可自定义的数据存储

纪事本 乱码总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作,而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是,它做得特别不好。 自定义数据存储在性能方面可以实现什么? 您可以支持&#…

datavideo切换台说明书_【新品发布】datavideo SE-650 高清四通道切换台

还在为音乐演唱会的拍摄而烦恼吗?或者为体育比赛的多机位发愁?或者为微课、优课、慕课制作而焦头烂额?大部分用户对多机位的恐惧来源于相关产品令人发指的复杂和专业性,面对满眼的键盘会有无从下手之感,很多学校和工作…

NSA:建议从 C/C++ 切换到内存安全语言

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删美国国家安全局(NSA)发布了一份指南,旨在帮助软件开发商和运营商预防和缓解软件内存安全问题。其鼓励组织将编…

探索cqrs和事件源_编写基于事件的CQRS读取模型

探索cqrs和事件源关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是,尽管也有一些有趣的考虑,但读取模型经常被忽略。 在本文中,我们将介绍通过使用事件流来填充视图模型的示例实现。 总览 …

shmmax单位_kernel.shmmax ,kernel.shmmni 和kernel.shmall

kernel.shmmax 2147483648//该参数定义了共享内存段的最大尺寸(以字节为单位)。其值应>sag_max_size初始化参数的大小,否则SAG由多个内存段构成,效率降低,还要不小于物理内存的一半,默认情况下在32位x86系统中,OracleSGA最大不能超过1.7GB.缺省为32M,对于oracle…

C# 11正式发布

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C# 11 现已发布。公告称,“随着每个版本的发布,社区的参与度越来越高,贡献了从建议、见解和错误报告到整个功…

java 自定义运算符_Java中集合的自定义运算符

java 自定义运算符总览 操作员重载有多种语言可用。 Java对String类型的运算符的支持对运算符的重载非常有限。 我们可以利用其他语言支持运算符的不同方式,但是我们可以在Java中实现一个使用Java已经使用的约定的实现。 获取,设置和放置操作 集合的运…

marker主题 ros_(五)ROS主题理解

参考网址:1,小海龟例子(1) 在新的终端打开roscore$ roscore---如果出错,请确定关闭所有ROS命令或者路径,重试。(2) 在新的终端打开运行小海龟界面$ rosrun turtlesimturtlesim_node得到结果&…

分享一个通用的嵌入式驱动层

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C 语言面向对象编程的最佳实践一、前言以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会…

cks32和stm32_cks子,间谍,局部Mo子和短管

cks32和stm32本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证…

CSON+CJSON,解析json数据更优雅?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删前言json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上&a…

服务总线yali测试_服务器的压力测试方法与流程

本发明涉及服务器的测试技术领域,特别是涉及一种包括超路径互联总线的服务器的压力测试方法。技术背景QPI(Quick Path Interconnect,快速通道互联)总线技术是一种取代前端总线(FSB)的CPU(处理器)间点对点连接技术。英特尔公司在2017年发起UPI(Ultra Path…

deprecated_@Deprecated新外观可能是什么?

deprecatedJDK增强建议 (JEP)277(“ 增强的弃用 ”)建议“重新定义弃用注释,并提供加强功能生命周期尾端的工具。” 当前 java.lang.Deprecated的一些限制使我困扰了一段时间。 我特别希望能够使用Deprecated提供文本&…

轨道运营管理专业自荐书_轨道运营管理专业自荐信x

轨道运营管理专业自荐信尊敬的领导:您好!非常感谢您们在百忙之中审阅我的求职资料。这对一个即将步入社 会的学子来说是莫大的鼓舞。我是西安联合学院城市轨道运营管理专业的一名学生, 2011年 7 月即将步 入社会,心情是那么的激动…

让C语言源码可知自身函数的实际地址与大小

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删事情的起因大概是这样……在很久很久以前,我最早用的是MASM(Win32ASM)写程序,从平台兼容性、开发…