首页 > 其他分享 >组合模式

组合模式

时间:2023-12-14 16:25:44浏览次数:18  
标签:name 组合 Company component 模式 节点 new public

组合模式是树形结构的管理,例如组织结构,文件系统等。

组合模式有三个角色,一个是抽象构件,一个是容器构件,一个是叶子构件,容器构件和叶子构件的区别就是容器构件可以添加删除子容器或者叶子,叶子构件没有此功能。

组合模式分为透明组合模式和安全组合模式,其区别是透明模式会把增加或者删除子节点的方法抽象到抽象构件里,安全组合模式则只有容器构件和叶子构件公共的方法。

示例代码:

透明组合模式

/// <summary>
/// 抽象公共方法组件
/// </summary>
public abstract class Company_Component
{
public string name { get; set; }
public Company_Component(string name)
{
this.name = name;
}
public abstract void Operation();
public abstract void AddChild(Company_Component component);
public abstract void RemoveChild(Company_Component component);
}

 

/// <summary>
/// 实现枝节点
/// </summary>
public class Company_Composite : Company_Component
{
public string name { get; set; }
public List<Company_Component> company_Components;
public Company_Composite(string name) : base(name)
{
this.name = name;
this.company_Components = new List<Company_Component>();
}
public override void Operation()
{
Console.WriteLine("组合节点" + name + "的操作");
//调用所有子节点的操作
foreach (var item in company_Components)
{
item.Operation();
}
}
public override void AddChild(Company_Component component)
{

Console.WriteLine($"当前节点:{this.name}添加---{component.name}节点");
company_Components.Add(component);
}
public override void RemoveChild(Company_Component component)
{
company_Components.Remove(component);
}
}

/// <summary>
/// 实现叶节点
/// </summary>
public class Company_Leaf : Company_Component
{

public Company_Leaf(string name) : base(name)
{
}

public override void AddChild(Company_Component component)
{
Console.WriteLine("叶节点不能添加节点");
}

public override void Operation()
{
Console.WriteLine("叶节点" + name + "的操作");
}

public override void RemoveChild(Company_Component component)
{
Console.WriteLine("叶节点没有节点");
}
}

/// <summary>
/// 客户端调用
/// </summary>
public void Client()
{
//创建根节点对象
Company_Component component = new Company_Composite("component");
//Console.WriteLine($"当前节点:{component.name}");
//创建两个组合节点对象
Company_Component composite1 = new Company_Composite("composite1");
Company_Component composite2 = new Company_Composite("composite2");

//将两个组合节点对象添加到根节点
component.AddChild(composite1);
component.AddChild(composite2);

//给第一个组合节点对象添加两个叶子节点
Company_Component leaf1 = new Company_Leaf("leaf1");
Company_Component leaf2 = new Company_Leaf("leaf2");
composite1.AddChild(leaf1);
composite1.AddChild(leaf2);

//给第二个组合节点对象添加一个叶子节点和一个组合节点
Company_Component leaf3 = new Company_Leaf("leaf3");
Company_Component composite3 = new Company_Composite("composite3");
composite2.AddChild(leaf3);
composite2.AddChild(composite3);

//给第二个组合节点下面的组合节点添加两个叶子节点
Company_Component leaf4 = new Company_Leaf("leaf4");
Company_Component leaf5 = new Company_Leaf("leaf5");
composite3.AddChild(leaf4);
composite3.AddChild(leaf5);

//执行所有节点的操作
// component.Operation();
}

安全组合模式

/// <summary>
/// 抽象公共方法组件
/// </summary>
public abstract class Company_Components
{
public string name { get; set; }
public Company_Components(string name)
{
this.name = name;
}
public abstract string Operation();
}

/// <summary>
/// 实现枝节点
/// </summary>
public class Company_Composites : Company_Components
{
public string name { get; set; }
public List<Company_Components> company_Components;
public Company_Composites(string name) : base(name)
{
this.name = name;
this.company_Components = new List<Company_Components>();
}
public override string Operation()
{
Console.WriteLine("组合节点" + name + "的操作");
return name;
}
public void AddChild(Company_Components component)
{

Console.WriteLine($"当前节点:{this.name}添加---{component.name}节点");
company_Components.Add(component);
}
public void RemoveChild(Company_Components component)
{
company_Components.Remove(component);
}
}

/// <summary>
/// 实现叶节点
/// </summary>
public class Company_Leafs : Company_Components
{

public Company_Leafs(string name) : base(name)
{
}

public override string Operation()
{
Console.WriteLine("叶节点" + name + "的操作");
return name;
}
}

public void Client()
{
//创建根节点对象
Company_Composites component = new Company_Composites("component");
//Console.WriteLine($"当前节点:{component.name}");
//创建两个组合节点对象
Company_Composites composite1 = new Company_Composites("composite1");
Company_Composites composite2 = new Company_Composites("composite2");

//将两个组合节点对象添加到根节点
component.AddChild(composite1);
component.AddChild(composite2);

//给第一个组合节点对象添加两个叶子节点
Company_Components leaf1 = new Company_Leafs("leaf1");
Company_Components leaf2 = new Company_Leafs("leaf2");
composite1.AddChild(leaf1);
composite1.AddChild(leaf2);

//给第二个组合节点对象添加一个叶子节点和一个组合节点
Company_Leafs leaf3 = new Company_Leafs("leaf3");
Company_Composites composite3 = new Company_Composites("composite3");
composite2.AddChild(leaf3);
composite2.AddChild(composite3);

//给第二个组合节点下面的组合节点添加两个叶子节点
Company_Components leaf4 = new Company_Leafs("leaf4");
Company_Components leaf5 = new Company_Leafs("leaf5");
composite3.AddChild(leaf4);
composite3.AddChild(leaf5);

//执行所有节点的操作
// component.Operation();
}

标签:name,组合,Company,component,模式,节点,new,public
From: https://www.cnblogs.com/seeksimple/p/17901396.html

相关文章

  • C++ Qt开发:ComboBox下拉组合框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ComboBox下拉组合框组件的常用方法及灵活运用。在Qt中,ComboBox(组合框)是一种常用的用户界面控件,它......
  • 适配器模式
    适配器模式分为类适配器和对象适配器。适配器有三个角色,一个是目标(Target),一个是被适配者,一个是适配者。类适配器和对象适配器的区别是,类适配器是适配者继承目标(Targer)的同时也实现被适配者的抽象接口,对象适配器是适配者只继承目标(Targer),适配者内会有一个被适配者对象。示例代......
  • JS监听系统是否为暗黑模式
    //在App.vue文件下定义即可//useDark()和useToggle()均需要安装@vueuse/core包即可使用npminstallelement-plus--save安装Element-Plusnpminstall@vueuse/core--save安装@vueuse/coreif(window.matchMedia('(prefers-color-scheme:dar......
  • 聊一聊 .NET高级调试 内核模式堆泄露
    一:背景1.讲故事前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下:在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已经明确告诉你了,不是用户态程序吃的内存,那就是内核态程序吃的,比如:某些驱动程序操......
  • 关于设计模式
    一、设计原则:保留不变的部分,抽取变化的部分面向接口编程多用组合,少用继承对拓展开放,对修改关闭二、设计模式1、策略模式利用多态,将变化的部分抽象成一个接口,针对该接口有不同的实现2、观察者模式主题接口和观察者接口主题维护观察者的增加、删除、通知;3、装饰者模式......
  • 软件设计模式需要考虑的原则
    1.单一职责原则(SRP,SingleResponsibilityPrinciple)一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。职责分离,提升模块的可复用性,SRP是实现高内聚、低耦合的指导方针。2.开闭原则(OCP,Open-ClosedPrinciple)软件实体应该对扩展开放,对修改关闭。表示软件实体......
  • Python实现软件设计模式1:简单工厂/静态工厂模式
    包含的角色工厂角色Factory静态方法抽象产品角色Product声明公用的抽象方法和属性具体产品角色ConcreteProduct覆盖抽象产品中声明的方法,多种产品多种覆盖模式特点可以降低系统耦合度,使用工厂方法时无需知道对象创建细节,传入工厂类的参数可以是字......
  • 利用CRM优化LTC流程——企业客户管理的新模式探讨
     在现代商业环境下,将潜在客户转化成实际销售是公司成功的基石之一。而CRM管理系统是完成LTC的有效工具。本文将向您介绍LTC是什么?公司怎样企业如何通过CRM实现这一流程的?LTC(从线索到现金)是企业运营管理中的一个重要概念,包括从获取销售线索到提供解决方案、签署商业合同、进行......
  • 设计模式:简单工厂模式
    简单工厂模式不直接向客户端暴露对象创建的实现细节,而通过一个工厂类来负责创建产品类的实例。简单工厂模式的组成:抽象产品(AbstractProduct):定义产品的接口,在这个例子中是Payment类。具体产品(ConcreteProduct):实现抽象产品接口的类,在这个例子中是Alipay和Wechat......
  • 简单写一下设计模式7原则
    开闭原则:只许增加,不许修改;使用抽象进行构建,使用实现拓展细节;面向抽象编程;提高可复用性和可维护性依赖倒转原则:依赖抽象,而不是依赖具体的实现,可以减少耦合性,提高系统稳定性,降低修改程序的风险单一职责原则:一个类,接口,方法只负责一个职责;降低复杂度,提高可维护性接口隔离原则:使用多......