c# 组合模式
- 作者: 赤脚水上飞
- 来源: 51数据库
- 2021-08-18
结构图:

抽象对象:
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();
}
}

抽象对象:
复制代码 代码如下:
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();
}
}
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
