设计模式之 组合模式 C# 范例

news/2024/12/18 2:38:31/

组合模式(Composite Pattern)是一个结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和对象集合。

在C#中,组合模式通常有以下几个要素:

  1. Component:定义所有类共有的接口,既可以是叶子节点也可以是组合节点的父类。
  2. Leaf:叶子节点类,表示没有子节点的对象。
  3. Composite:组合节点类,表示可以包含子节点的对象,它实现了Component接口并包含多个子组件。

使用示例

假设你正在设计一个图形库,图形可以是单一的图形(如圆形、矩形),也可以是包含多个图形的组合(如图形组合)。

1. 定义组件(Component)

 
using System;
using System.Collections.Generic;// 组件接口,定义了所有叶子和组合对象的共同操作
public interface IGraphic
{void Draw();  // 绘制图形void Add(IGraphic graphic);  // 添加子图形(组合对象才有此方法)void Remove(IGraphic graphic);  // 移除子图形
}

2. 定义叶子节点(Leaf)

叶子节点是图形中的基本元素,如CircleRectangle,这些元素不包含任何子图形。

 
// 叶子节点,表示单一的图形
public class Circle : IGraphic
{public void Draw(){Console.WriteLine("Drawing a Circle.");}public void Add(IGraphic graphic){throw new InvalidOperationException("Cannot add a child to a leaf.");}public void Remove(IGraphic graphic){throw new InvalidOperationException("Cannot remove a child from a leaf.");}
}public class Rectangle : IGraphic
{public void Draw(){Console.WriteLine("Drawing a Rectangle.");}public void Add(IGraphic graphic){throw new InvalidOperationException("Cannot add a child to a leaf.");}public void Remove(IGraphic graphic){throw new InvalidOperationException("Cannot remove a child from a leaf.");}
}

3. 定义组合节点(Composite)

组合节点可以包含多个子图形(无论是Leaf还是其他Composite对象)。

// 组合节点,表示可以包含多个图形的容器
public class GraphicGroup : IGraphic
{private List<IGraphic> _graphics = new List<IGraphic>();public void Draw(){Console.WriteLine("Drawing Group of Graphics:");foreach (var graphic in _graphics){graphic.Draw();  // 调用每个图形的Draw方法}}public void Add(IGraphic graphic){_graphics.Add(graphic);  // 添加子图形}public void Remove(IGraphic graphic){_graphics.Remove(graphic);  // 移除子图形}
}

4. 使用组合模式

 
public class Program
{public static void Main(string[] args){// 创建单个图形对象IGraphic circle = new Circle();IGraphic rectangle = new Rectangle();// 创建一个图形组,将多个图形组合成一个整体GraphicGroup group = new GraphicGroup();group.Add(circle);group.Add(rectangle);// 创建一个更大的组合GraphicGroup mainGroup = new GraphicGroup();mainGroup.Add(group);  // 将一个组合加入到另一个组合中mainGroup.Add(new Circle());  // 也可以直接加入单一的图形// 绘制所有图形Console.WriteLine("Drawing individual elements:");circle.Draw();rectangle.Draw();Console.WriteLine("\nDrawing grouped elements:");group.Draw();Console.WriteLine("\nDrawing main group:");mainGroup.Draw();}
}

输出结果:

 
Drawing individual elements:
Drawing a Circle.
Drawing a Rectangle.Drawing grouped elements:
Drawing Group of Graphics:
Drawing a Circle.
Drawing a Rectangle.Drawing main group:
Drawing Group of Graphics:
Drawing Group of Graphics:
Drawing a Circle.
Drawing a Rectangle.
Drawing a Circle.

解释

  • Leaf(叶子节点)CircleRectangle类是叶子节点,它们实现了IGraphic接口,并且它们不允许添加或移除子图形,因为它们是单独的图形。

  • Composite(组合节点)GraphicGroup类是组合节点,它可以包含多个IGraphic对象(包括其他组合节点和叶子节点)。它实现了IGraphic接口,并且提供了AddRemove方法来管理子图形。

  • 客户端代码:在Program类中,创建了单个图形(如CircleRectangle),并通过组合(GraphicGroup)将它们组织起来。客户端可以统一调用Draw方法,无论它是操作单个图形还是多个图形的组合。

优点

  • 统一接口:客户端代码对单个对象和组合对象的使用方式一致,简化了代码。
  • 灵活性:允许递归地组合对象,形成树形结构,可以灵活地添加或移除子节点。
  • 扩展性:如果以后需要支持更多的图形元素,只需在现有的结构基础上扩展,而无需修改现有代码。

这个示例展示了组合模式如何在现实应用中提供更大的灵活性和可扩展性,特别适合于层次化的树形结构场景。


http://www.ppmy.cn/news/1556015.html

相关文章

《Docker - Docker Container(容器)之容器实战》

一、引言 Docker 是一种开源的容器化平台&#xff0c;它可以将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;从而实现快速部署、可扩展性和隔离性。在 Docker 中&#xff0c;容器是运行应用程序的基本单元&#xff0c;它提供了一种轻量级、高效的方式来管理应用程序…

PPT技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片&#xff0c;想要将图片中的背景设置为透明或者想要抠图&#xff0c;有什么方法吗&#xff1f;今天分享两个方法。 方法一&#xff1a; 添加图片&#xff0c;选中图片之后&#xff0c;点击【图片格式】功能&#xff0c;点击最左边的【删除背景】 PPT会自动帮…

【python篇】——python基础语法一篇就能明白,快速理解

前言&#xff1a;本文章是在已经学习了C语言之后作者角度下进行书写的一篇关于python当中基础的语法说明。 文章目录 快速深入理解python当中的语法基本数据类型算数运算符类型的查看与转换 变量的输入与输出条件语句比较运算符和逻辑运算符if、elif、else三目运算符 循环语句w…

【学习笔记】移动端浏览器的视口

两个视口 视觉视口&#xff1a;是当前显示屏页面中的一部分 布局视口&#xff1a;完整页面的大小 视觉视口 布局视口有多宽&#xff1f;这因浏览器而异。Safari iPhone使用980px&#xff0c; Opera 850px, Android WebKit 800px, IE 974px 视觉视口和布局视口相同 局视口宽度…

Servlet容器来扫描指定包中的类 找到带有WebServlet注解的类

项目框架如上图 myweb下边三个类 package com.qcby.tomcat.myweb;import com.qcby.tomcat.webServlet.WebServlet;WebServlet(urlPatterns {"MyFirstServlet"}) public class MyFirstServlet {}package com.qcby.tomcat.myweb;import com.qcby.tomcat.webServlet.W…

《数据结构之美-- 单链表》

引言&#xff1a; 首先由上次我们实现的顺序表聊起&#xff0c;我们在实现顺序表的时候会发现&#xff0c;在每次插入数据时当空间不够时就会涉及到扩容&#xff0c;而顺序表的扩容一般都是呈二倍的形式来进行&#xff0c;因此这就有可能造成空间的浪费&#xff0c;那该如何解…

计算机网络知识点全梳理(二.HTTP知识点总结)

目录 HTTP基本概念 HTTP优缺点 HTTP优点&#xff08;1.1&#xff09; HTTP缺点 HTTP与HTTPS HTTP 与 HTTPS 的区别 HTTPS 解决 HTTP 的哪些安全问题&#xff1f; HTTPS 如何解决安全问题&#xff1f; HTTPS 连接建立的过程&#xff1a; HTTP/1.1、HTTP/2、HTTP/3 演…

C++之一:基础

相关代码&#xff1a;cpp/month12/test_12/main.cpp Hera_Yc/bit_C_学习 - 码云 - 开源中国 C面向对象的语言 C兼容C&#xff1a;因此&#xff0c;C亦可以是面向过程的语言。 C的基础知识是特别碎的&#xff0c;但这并不意味着这些知识并不重要&#xff0c;这些碎片化的内容…