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

09_组合模式

时间:2024-03-11 11:00:26浏览次数:25  
标签:组合 09 Component 模式 节点 Add new public

组合模式是一种结构型设计模式,它允许我们将对象组合成树状结构,以表示“整体-部分”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,无需区分它们的差异。

组合模式有三个主要角色:

  1. 组件(Component):定义了组合中的对象的公共接口,可以是抽象类或接口,并提供了一些默认的实现。

  2. 叶子节点(Leaf):表示组合中的叶子节点对象,它没有子节点。

  3. 容器节点(Composite):表示组合中的容器节点对象,它可以包含其他子节点。

组合模式的工作原理如下:

  1. 所有的组件都实现了统一的组件接口。

  2. 叶子节点实现了组件接口,并定义了叶子节点特有的行为。

  3. 容器节点实现了组件接口,并维护了一个子节点的列表。容器节点可以添加、删除和遍历子节点。

  4. 客户端通过调用组件接口的方法,可以统一地处理单个对象和组合对象。

组合模式的优点包括:

  1. 可以统一地对单个对象和组合对象进行操作,简化了客户端的代码。

  2. 可以以相同的方式处理组合对象和单个对象,提高了代码的可维护性和扩展性。

  3. 可以通过组合对象的嵌套来构建复杂的层次结构。

组合模式适用于以下场景:

  1. 当需要表示对象的层次结构,并希望以统一的方式处理单个对象和组合对象时,可以使用组合模式。

  2. 当希望客户端能够忽略组合对象与单个对象之间的差异,统一地操作它们时,可以使用组合模式。

总结而言,组合模式通过将对象组合成树状结构,使得客户端可以统一地处理单个对象和组合对象。它提供了一种处理对象层次结构的方式,简化了客户端的代码,并提高了代码的可维护性和扩展性。

 

Component

/// <summary>
    /// 抽象组件,统一接口
    /// </summary>
    public abstract  class Component
    {
        public string _name;
        public Component(string name)
        {
            _name = name;
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="component"></param>
        public abstract void Add(Component component);
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="component"></param>
        public abstract void Remove(Component component);
        /// <summary>
        /// 展示
        /// </summary>
        /// <param name="depth"></param>
        public abstract void Display(int depth);
    }

 

Composite

/// <summary>
    /// 枝节点
    /// </summary>
    public class Composite : Component
    {
        private List<Component> children = new List<Component>();
        public Composite(string name) : base(name)
        {
        }

        public override void Add(Component component)
        {
            children.Add(component);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + _name);
            foreach (Component component in children)
            {
                component.Display(depth+1);
            }
        }

        public override void Remove(Component component)
        {
            children.Remove(component);
        }
    }

 

Leaf

public class Leaf : Component
    {
        public Leaf(string name) : base(name)
        {
        }

        public override void Add(Component component)
        {
            throw new Exception("叶节点不能添加子项");
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + _name);
        }

        public override void Remove(Component component)
        {
            throw new Exception("叶节点不能删除子项");
        }
    }

 

调用

public class Client
    {
        public void Start()
        {
            Component movie1 = new Leaf("电影01");//叶节点
            Component movie2 = new Leaf("电影02");
            Component movie3 = new Leaf("电影03");
            Component node1 = new Composite("喜剧片");//枝节点
            node1.Add(movie1);
            node1.Add(movie2);
            node1.Add(movie3);

            Component movie4 = new Leaf("电影04");//叶节点
            Component movie5 = new Leaf("电影05");
            Component movie6= new Leaf("电影06");
            Component node2 = new Composite("科幻片");//枝节点
            node2.Add(movie4);
            node2.Add(movie5);
            node2.Add(movie6);

            Component root = new Composite("电影");
            root.Add(node1);
            root.Add(node2);

            root.Display(1);
        }
    }
 static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

标签:组合,09,Component,模式,节点,Add,new,public
From: https://www.cnblogs.com/MingQiu/p/18065633

相关文章

  • 20240310-日记(包含0306-0309)
    为了证明0306号那天我是真准备写的。今天仍然是无所事事的一天,好像因为起得越来越晚,对象颇有微词了。昨天猫又在房间里跑酷,其实也算没怎么睡好。也是今天突然得知,入宅又变更到周五凌晨了。0307因为昨天刚得知还需要周五凌晨入住宅,所以对象的爹从老家赶过来,是晚上十点四十到......
  • 使用@Autowired + Map 实现策略模式
    创建接口publicinterfaceUserService{StringgetName();}创建多个类实现上面的接口实现一importcom.boot.service.UserService;importorg.springframework.stereotype.Service;@Service("zhangsan")publicclassZhangsanUserServiceImplimplementsUserServ......
  • CCE集群VPC网络模式下几种访问场景
    本文分享自华为云社区《【理解云容器网络】5-CCE集群VPC模型容器网络走线介绍》,作者:可以交个朋友。简介鉴于在CCE集群使用VPC网络模型,处理遇到的一些网络问题时,需要熟悉不同场景下数据包的流转过程,才能快速的解决问题。本文主要介绍CCE集群VPC网络模式下各种访问场景介绍。VPC......
  • Go 中的监视器模式与配置热更新
    Go中的监视器模式与配置热更新原创 波罗学 码途漫漫 2024-03-1108:03 上海 听全文上篇介绍GO的GUI库Fyne时,提到Fyne的数据绑定用到了监听器模式。本文就展开说下我对Go中监听器模式的理解和应用吧。监听器模式简介监听器模式,或称观察者模式,它主要涉及......
  • vs2019单独重新安装python37_64失败解决办法(bilibili上我最早写的是https://www.bilib
    上个周末的时候,我发现用vs2019编写python的时候。代码高亮出现了奇怪的问题,进入解决方案的时候,print还是蓝色的,但是过了几秒钟后就变为黑色了,因此在最开始的时候我试图通过换一个皮肤和在管理扩展里面找扩展来解决,但是还是有相关问题。于是到vs2019对应的python文件夹找问题,目录是......
  • lgB3717 计算组合数
    给出T次询问,每次给出n和m,求C(n,m)对998244353取模的结果。为了避免输出太多内容,只需要输出所有查询结果的异或和。1<=T<=5E6;0<=m<=n<=5E6先O(n)预处理出所有数的阶乘及其对应的乘法逆元,然后O(1)处理每次询问。#include<bits/stdc++.h>usingnamespacestd;#defineintlon......
  • lgP3807 lucas定理计算组合数
    有T次询问,每次给出整数n,m,p,计算C(n+m,n)%p的值。输入保证p为质数。1<=n,m,p<=1E5;1<=T<=10n较大,p较小且为质数时,可以用lucas定理来计算组合数:lucas(n,k,p)=lucas(n/p,k/p,p)*C(n%p,k%p,p)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definer......
  • 天梯选拔赛2补题_2024_03_09
    补题1:奶茶袋收集题意:做法:贪心。之前还做过类似的题,赛时一直想不出来。选择k个连续的的区间,就是需要添加k-1个挡板。问题是挡板设置在哪里?可以发现一个连续线段的max-min等于线段中各个差值之和。如果k=1,那么ans=∑(ai+1-ai);如果k=2,那么需要添加一个挡板。贪心地放,挡板应该放......
  • 08_桥接模式
    桥接模式是一种结构型设计模式,它将抽象和实现分离,使它们可以独立地变化。桥接模式通过将实现细节从抽象中分离出来,使得抽象和实现可以独立地进行扩展和修改。桥接模式有四个主要角色:抽象类(Abstraction):定义了抽象类的接口,并包含一个对实现类的引用。实现类接口(Implementor):定......
  • 洛谷 P1099 题解
    洛谷P1099【NOIP2007提高组】树网的核题意简述给定一棵带边权无根树和一个正整数\(s\)。在这棵树的任意直径上截取一段长度不超过\(s\)的路径\(F\),使离\(F\)最远的点到\(F\)的距离最小,求出这个距离。思路记\(\delta(a,b)\)为\(a,b\)之间的路径。对于任意......