c# 组合模式
发布时间:2022-07-07 09:04:09
标签:组合模式
结构图:
抽象对象:
abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
public abstract void Add(Component c);
public abstract void Remove(Component c);
public abstract void Display(int depth);
}
无子节点的:
class Leaf : Component
{
public Leaf(string name)
: base(name)
{ }
public override void Add(Component c)
{
//throw new NotImplementedException();
Console.WriteLine("Cannot add to a Leaf");
}
public override void Remove(Component c)
{
//throw new NotImplementedException();
Console.WriteLine("Cannot remove to a Leaf");
}
public override void Display(int depth)
{
//throw new NotImplementedException();
Console.WriteLine(new string('-', depth) + name);
}
}
可以有子结点:
class Composite : Component
{
private List<Component> children = new List<Component>();
public Composite(string name)
: base(name)
{ }
public override void Add(Component c)
{
//throw new NotImplementedException();
children.Add(c);
}
public override void Remove(Component c)
{
//throw new NotImplementedException();
children.Remove(c);
}
public override void Display(int depth)
{
//throw new NotImplementedException();
Console.WriteLine(new string('-', depth) + name);
foreach (Component component in children)
{
component.Display(depth + 2);
}
}
}
主函数调用:
class Program
{
static void Main(string[] args)
{
Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
Composite comp2 = new Composite("Composite X");
comp2.Add(new Leaf("Leaf XYA"));
comp2.Add(new Leaf("Leaf XYB"));
comp.Add(comp2);
root.Display(1);
Console.ReadKey();
}
}


猜你喜欢
- 废话不多说了,直接给大家贴代码了。具体代码如下所述:<?xml version="1.0" encoding=&q
- 当app中打开了多个activity的时候,由于进入的比较深,所以,很多app不得不让用户一步一步退回到第一个界面(MainActivity
- SWT中没有AWT的BorderLayout布局管理器。下面是SWT下的自定义实现: BorderLayout.java package s
- 1 依赖配置<parent> <groupId>org.springframework.b
- 配置文件中使用${}注入值方式在springboot中使用System.setProperty设置参数user: user-na
- 本文实例讲述了Android开发之全屏与非全屏的切换设置方法。分享给大家供大家参考,具体如下:静态方法1. 代码方式在Activity类On
- 这篇文章中我们来继续学习Picasso中还提供了哪些扩展功能,一个好的框架一定是扩展性强的,你需要的我刚好有。下面看一下都提供了哪些扩展功能
- 一:背景1. 讲故事每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻
- 目录1,基本介绍2,HttpURLConnection实现3.HttpClient实现4.Spring的RestTemplate1,基本介绍
- 一、背景Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和
- 本文实例讲述了C#编程实现取整和取余的方法。分享给大家供大家参考,具体如下:"%"为取余号,不用多说。 "/&
- 使用mybatis-plus自动生成了5个模块(xml/bean/mapper/service/controller)的代码,这里练习一下m
- Http通信概述Http通信主要有两种方式POST方式和GET方式。前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制
- 一、开篇通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印象的了解了。但是事情不能总停留在理论层面,还得多多实现,才
- 对于自定义注解这里就不唠叨了,百度一大堆,这里有我一个自定义注解@Retention(RetentionPolicy.RUNTIME)@Ta
- 引言前边两章说了点基础的,从这章开始,我们挖挖源码。看看RocketMQ是怎么工作的。首先呢,这个生产者就是送孩子去码头的家长,孩子们呢,就
- 在Android开发中,列表可以说是最常见的了,一般都是使用ListView,当涉及到二维数组时,更多的使用到ExpandableListV
- 1. 基本用法<dependency> <groupId>org.redisson</groupI
- 刚开始用的Mouse_up,虽然能捕获事件,但是没有KeyPress事件的Handled属性。发现一个相对简单的方法。1.先让窗体类继承IM
- 我们与客户端的接 * 互中,为了更高的安全性,我们可能需要对接口加密(请求参数加密,服务端解密)、返回信息加密(服务端加密,客户端解密),但是