【23种设计模式】组合模式(八)

这篇具有很好参考价值的文章主要介绍了【23种设计模式】组合模式(八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

组合模式,英文名称是:Composite Pattern。当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意思,那就是“俄罗斯套娃”。“俄罗斯套娃”就是大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的那个瓷器娃娃为止。在我们的操作系统中有文件夹的概念,文件夹可以包含文件夹,可以嵌套多层,最里面包含的是文件,这个概念和“俄罗斯套娃”很像。
【23种设计模式】组合模式(八)

组合模式的定义

客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等方面的弊端。组合设计模式就是将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

组合模式的组成

【23种设计模式】组合模式(八)

  • 抽象构件角色(Component):这是个抽象角色,它给参加组合的对象定义出了公共的接口及默认行为,可以用来管理所有的子对象。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝结构对象给出。

  • 树叶构件角色(Leaf):树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。(原始对象的行为可以理解为没有容器对象管理子对象的方法,或者 【原始对象行为】+【管理子对象的行为(Add,Remove等)】=面对客户代码的接口行为集合)

  • 树枝构件角色(Composite):代表参加组合的有下级子对象的对象,树枝对象给出所有管理子对象的方法实现,如Add、Remove等。

组合模式的代码实现

组合模式有两种实现方式,一种是:透明式的组合模式,另外一种是:安全式的组合模式。

所谓透明式是指“抽象构件角色”定义的接口行为集合包含两个部分,一部分是叶子对象本身所包含的行为(比如Operation),另外一部分是容器对象本身所包含的管理子对象的行为(Add,Remove)。这个抽象构件必须同时包含这两类对象所有的行为,客户端代码才会透明的使用,无论调用容器对象还是叶子对象,接口方法都是一样的,这就是透明

所谓安全式是指“抽象构件角色”只定义叶子对象的方法,确切的说这个抽象构件只定义两类对象共有的行为,然后容器对象的方法定义在“树枝构件角色”上,这样叶子对象有叶子对象的方法,容器对象有容器对象的方法,这样责任很明确,当然调用肯定不会抛出异常了。

大家可以根据自己的情况自行选择是实现为“透明式”还是“安全式”的,以下我们会针对这两种情况都有实现,具体实现如下:

透明式

代码定义

 /// <summary>
    /// Transparent 透明式实现
    /// </summary>
    public class Transparent
    {
        /// <summary>
        /// 该抽象类就是文件夹抽象接口的定义,该类型就相当于是抽象构件Component类型
        /// </summary>
        public abstract class Folder
        {
            //增加文件夹或文件
            public abstract void Add(Folder folder);

            //删除文件夹或者文件
            public abstract void Remove(Folder folder);

            //打开文件或者文件夹--该操作相当于Component类型的Operation方法
            public abstract void Open();
        }

        /// <summary>
        /// 该Word文档类就是叶子构件的定义,该类型就相当于是Leaf类型,不能在包含子对象
        /// </summary>
        public sealed class Word : Folder
        {
            //增加文件夹或文件
            public override void Add(Folder folder)
            {
                throw new Exception("Word文档不具有该功能");
            }

            //删除文件夹或者文件
            public override void Remove(Folder folder)
            {
                throw new Exception("Word文档不具有该功能");
            }

            //打开文件--该操作相当于Component类型的Operation方法
            public override void Open()
            {
                Console.WriteLine("打开Word文档,开始进行编辑");
            }
        }

        /// <summary>
        /// SonFolder类型就是树枝构件,由于我们使用的是“透明式”,所以Add,Remove都是从Folder类型继承下来的
        /// </summary>
        public class SonFolder : Folder
        {
            //增加文件夹或文件
            public override void Add(Folder folder)
            {
                Console.WriteLine("文件或者文件夹已经增加成功");
            }

            //删除文件夹或者文件
            public override void Remove(Folder folder)
            {
                Console.WriteLine("文件或者文件夹已经删除成功");
            }

            //打开文件夹--该操作相当于Component类型的Operation方法
            public override void Open()
            {
                Console.WriteLine("已经打开当前文件夹");
            }
        }
    }

调用实现

  public void RunTest()
        {
            //Folder myword = new Word();
            //myword.Open();//打开文件,处理文件

            //myword.Add(new SonFolder());//抛出异常
            //myword.Remove(new SonFolder());//抛出异常


            Folder myfolder = new SonFolder();
            myfolder.Open();//打开文件夹

            myfolder.Add(new SonFolder());//成功增加文件或者文件夹
            myfolder.Remove(new SonFolder());//成功删除文件或者文件夹

            Console.Read();
        }

【23种设计模式】组合模式(八)

安全式

代码定义

  /// <summary>
    /// Secure 安全式实现
    /// </summary>
    public class Secure
    {
        /// <summary>
        /// 该抽象类就是文件夹抽象接口的定义,该类型就相当于是抽象构件Component类型
        /// </summary>
        public abstract class Folder //该类型少了容器对象管理子对象的方法的定义,换了地方,在树枝构件也就是SonFolder类型
        {
            //打开文件或者文件夹--该操作相当于Component类型的Operation方法
            public abstract void Open();
        }

        /// <summary>
        /// 该Word文档类就是叶子构件的定义,该类型就相当于是Leaf类型,不能在包含子对象
        /// </summary>
        public sealed class Word : Folder  //这类型现在很干净
        {
            //打开文件---该操作相当于Component类型的Operation方法
            public override void Open()
            {
                Console.WriteLine("打开Word文档,开始进行编辑");
            }
        }

        /// <summary>
        /// SonFolder类型就是树枝构件,现在由于我们使用的是“安全式”,所以Add,Remove都是从此处开始定义的
        /// </summary>
        public abstract class SonFolder : Folder //这里可以是抽象接口,可以自己根据自己的情况而定
        {
            //增加文件夹或文件
            public abstract void Add(Folder folder);

            //删除文件夹或者文件
            public abstract void Remove(Folder folder);

            //打开文件夹--该操作相当于Component类型的Operation方法
            public override void Open()
            {
                Console.WriteLine("已经打开当前文件夹");
            }
        }

        /// <summary>
        /// NextFolder类型就是树枝构件的实现类
        /// </summary>
        public sealed class NextFolder : SonFolder
        {
            //增加文件夹或文件
            public override void Add(Folder folder)
            {
                Console.WriteLine("文件或者文件夹已经增加成功");
            }

            //删除文件夹或者文件
            public override void Remove(Folder folder)
            {
                Console.WriteLine("文件或者文件夹已经删除成功");
            }

            //打开文件夹--该操作相当于Component类型的Operation方法
            public override void Open()
            {
                Console.WriteLine("已经打开当前文件夹");
            }
        }

    }

调用实现

  public void RunTest()
        {
            //这是安全的组合模式
            Folder myword = new Word();

            myword.Open();//打开文件,处理文件


            Folder myfolder = new NextFolder();
            myfolder.Open();//打开文件夹

            //此处要是用增加和删除功能,需要转型的操作,否则不能使用
            ((SonFolder)myfolder).Add(new NextFolder());//成功增加文件或者文件夹
            ((SonFolder)myfolder).Remove(new NextFolder());//成功删除文件或者文件夹

        }

【23种设计模式】组合模式(八)

组合模式的优缺点

优点
  • 组合模式使得客户端代码可以一致地处理对象和对象容器,无需关心处理的是单个对象,还是组合的对象容器。

  • 将”客户代码与复杂的对象容器结构“解耦。

  • 可以更容易地往组合对象中加入新的构件。文章来源地址https://www.toymoban.com/news/detail-706221.html

缺点
  • 使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。

到了这里,关于【23种设计模式】组合模式(八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 【传统方式】 将学院看做是学校的子类,系是学院的子类,小的组织继承大的组织 分析: 在一个页面中展示出学校的院系组成,一个学校有多个

    2024年02月15日
    浏览(45)
  • Java设计模式-前言

     馆长准备了很多学习资料,其中包含 java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具  等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关

    2024年01月21日
    浏览(41)
  • 设计模式——10. 组合模式

    组合模式是一种结构型设计模式,用于将对象组合成树状结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式处理单个对象和组合对象(包含多个对象的容器),使得客户端无需关心它们之间的差异。 组合模式通常涉及两种主要角色: 叶子节点(Leaf):这是组

    2024年02月07日
    浏览(66)
  • 设计模式——组合模式

    组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。 组合模式将

    2024年02月11日
    浏览(68)
  • 设计模式-组合模式

    组合模式可以使用一棵树来表示 组合模式使得用户可以使用一致的方法操作单个对象和组合对象 组合模式又叫部分整体模式,将对象组合成树形结构以表示“部分-整体”的层次结构,可以更好的实现管理操作,部分-整体对象的操作基本一样,但是应该还会有不一样的地方

    2024年02月10日
    浏览(50)
  • 设计模式——组合模式08

    组合模式:把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式,一定要敲代码理解 满足开闭原则。叶子结点与非叶子结点都继承或实现同一抽象,只是叶子功能权限少,而非叶子结点需要容器记录子节点。 代码下载

    2024年04月11日
    浏览(48)
  • 设计模式:组合模式

    组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。 在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的

    2024年02月07日
    浏览(59)
  • 设计模式--组合模式

    某日,小明公司最近接到一个办公管理系统的项目,并且在每个城市都有分部。这属于是很常见的OA系统,只要前期将需求分析完善好,中后期开发维护是不难的。 然而,总部公司使用后觉得很OK,想要其他城市的分公司也执行使用。但是现在的问题是,其他分公司的部门和

    2024年01月21日
    浏览(58)
  • 结构型设计模式之组合模式【设计模式系列】

    C++技能系列 Linux通信架构系列 C++高性能优化编程系列 深入理解软件架构设计系列 高级C++并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    浏览(49)
  • 设计模式浅析(十) ·设计模式之迭代器&组合模式

    日常叨逼叨 java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁 案例 有两家门店,门店A呢只提供早餐,门店B呢只提供午餐,有一天这两家店铺想要进行合并,一起做大做强,再创辉煌。 合并后呢,对于菜单的定制存在了一定的问题: 门店A的

    2024年04月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包