返回顶部
首页 > 资讯 > 精选 >如何理解Java设计模式的组合模式
  • 377
分享到

如何理解Java设计模式的组合模式

2023-06-25 13:06:23 377人浏览 八月长安
摘要

这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所

这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、什么是组合模式

    定义:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。

    动机(Motivation)

    客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。

    如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

    意图(Intent)

    将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

    组合模式,现在学习就是虚类继承虚类,然后增加虚方法。最终实类继承第二个虚类,重写所有虚方法。

    二、组合模式的结构

    如何理解Java设计模式的组合模式

    结构图说明:

    (1)Component:组合中的对象声明接口,在适当情况下实现所有类共有的默认行为,声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。(可选)

    (2)Leaf:在组合中表示叶节点,叶节点没有子节点,定义对象的基本行为。

    (3)Composite:定义有子部件的那些部件的行为,存储子部件并在Component接口实现与子部件有关的操作。

    (4)Client:通过Component接口操作组合部件的对象。

    三、组合模式的使用场景

    需求重要体现部分与整体的层次结构时

    你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    四、组合模式的优缺点

    优点

    使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。

    更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。

    缺点

    组合模式不容易限制组合中的构件。

    五、组合模式的实现

    组合模式有两种实现方式,一种是:透明式的组合模式,另外一种是:安全式的组合模式。在这里我就详细说一下何为“透明式”,何为“安全式”。所谓透明式是指“抽象构件角色”定义的接口行为集合包含两个部分,一部分是叶子对象本身所包含的行为(比如Operation),另外一部分是容器对象本身所包含的管理子对象的行为(Add,Remove)。这个抽象构件必须同时包含这两类对象所有的行为,客户端代码才会透明的使用,无论调用容器对象还是叶子对象,接口方法都是一样的,这就是透明,针对客户端代码的透明,但是也有他自己的问题,叶子对象不会包含自己的子对象,为什么要有Add,Remove等类似方法呢,调用叶子对象这样的方法可能(注意:我这里说的是可能,因为有些人会把这些方法实现为空,不做任何动作,当然也不会有异常抛出了,不要抬杠)会抛出异常,这样就不安全了,然后人们就提出了“安全式的组合模式”。所谓安全式是指“抽象构件角色”只定义叶子对象的方法,确切的说这个抽象构件只定义两类对象共有的行为,然后容器对象的方法定义在“树枝构件角色”上,这样叶子对象有叶子对象的方法,容器对象有容器对象的方法,这样责任很明确,当然调用肯定不会抛出异常了。大家可以根据自己的情况自行选择是实现为“透视式”还是“安全式”的,以下我们会针对这两种情况都有实现,具体实现如下:

    namespace 透明式的组合模式的实现{    /// <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 class Program    {        static void Main()        {            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();        }    }}

    以上代码就是“透明式的组合模式”实现,以下代码就是“安全式的组合模式”实现:

    namespace 安全式的组合模式的实现{    /// <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 class Program    {        static void Main()        {            //这是安全的组合模式            Folder myword = new Word();            myword.Open();//打开文件,处理文件            Folder myfolder = new NextFolder();            myfolder.Open();//打开文件夹            //此处要是用增加和删除功能,需要转型的操作,否则不能使用            ((SonFolder)myfolder).Add(new NextFolder());//成功增加文件或者文件夹            ((SonFolder)myfolder).Remove(new NextFolder());//成功删除文件或者文件夹            Console.Read();        }    }}

    六、组合模式的.net下应用

    asp.net中的Panel对象就是一个Composite对象,而Button对象就是Leaf对象。Button和Panel都继承自System.WEB.UI.Control类。它实际上是在Panel里面加了一个Controls属性,然后Controls属性是一个集合属性,它有Add和Remove方法。

    在ASP.Net中就是这样,每一个控件都有Controls属性,也就是说每个控件都是一种容器控件(除了LiteralControl)。这种方式把我们对安全性的担忧,统统放到容器(即ASP.Net中的Controls)中去处理。

    这个模式在.NET 中最典型的应用就是应用与winforms和Web的开发中,在.NET类库中,都为这两个平台提供了很多现有的控件,然而System.windows.FORMs.dll中System.Windows.Forms.Control类就应用了组合模式,因为控件包括Label、TextBox等这样的简单控件,这些控件可以理解为叶子对象,同时也包括GroupBox、DataGrid这样复合的控件或者叫容器控件,每个控件都需要调用OnPaint方法来进行控件显示,为了表示这种对象之间整体与部分的层次结构,微软把Control类的实现应用了组合模式(确切地说应用了透明式的组合模式)。

    到此,关于“如何理解Java设计模式的组合模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: 如何理解Java设计模式的组合模式

    本文链接: https://lsjlt.com/news/305053.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 如何理解Java设计模式的组合模式
      这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所...
      99+
      2023-06-25
    • Java设计模式:组合模式
      目录概述结构组合模式案例分析总结在本讲,我们来学习一下结构型模式里面的第六个设计模式,即组合模式。 概述 在学习组合模式之前,我们先来看下面这张图。 对于以上这张图大家应该很熟悉,...
      99+
      2024-04-02
    • java设计模式-组合模式详解
      目录组合模式Demo代码:总结组合模式 组合模式(Composite Pattern)又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来...
      99+
      2024-04-02
    • 深入理解Java设计模式之组合模式
      目录一、什么是组合模式动机(Motivation)意图(Intent)二、组合模式的结构结构图说明:三、组合模式的使用场景四、组合模式的优缺点五、组合模式的实现六、组合模式的.NET...
      99+
      2024-04-02
    • 快速理解Java设计模式中的组合模式
      组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。个人理解:组合模式就是将部分组装成整体。定义如下:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象...
      99+
      2023-05-30
      java 设计模式 ava
    • Java设计模式之java组合模式详解
      目录引言组合模式介绍角色模式结构示例代码水果盘文件浏览更复杂的组合模式透明与安全透明组合模式安全组合模式组合模式总结优点缺点适用场景应用XML文档解析文件HashMapMybatis...
      99+
      2024-04-02
    • Java设计模式之组合模式
      本文通过老王和小王探讨书房、书架、各类书的管理问题,引出结构型设计模式家族中的一个重要成员——组合模式,本文会给予两种组合模式的典型代码实现,为了加深理解会在...
      99+
      2024-04-02
    • Java设计模式中的组合模式
      目录模式介绍UML类图组合模式案例组合模式的注意事项和细节模式介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以...
      99+
      2024-04-02
    • Java设计模式之组合模式的示例详解
      目录定义原理类图案例需求方案分析总结定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象...
      99+
      2024-04-02
    • 分析Java设计模式之组合模式
      目录一、概述二、 模式定义三、 模式结构四、 模式实现五、 模式优缺点5.1、优点5.2、缺点六、 模式适用场景七、 模式总结一、概述 我们对于这个图片肯定会非常熟悉,这两幅图片我...
      99+
      2024-04-02
    • 如何理解Java设计模式的状态模式
      本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是状态模式定义:当一个对象的内在状态...
      99+
      2023-06-25
    • 如何理解Java设计模式的享元模式
      本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量...
      99+
      2023-06-25
    • 如何理解Java设计模式的桥接模式
      这篇文章主要讲解了“如何理解Java设计模式的桥接模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的桥接模式”吧!一、什么是桥接模式桥接模式(Bridge Patt...
      99+
      2023-06-25
    • 如何理解Java设计模式的装饰模式
      这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所...
      99+
      2023-06-25
    • 如何理解Java设计模式的单例模式
      这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式...
      99+
      2023-06-25
    • 如何理解Java设计模式的命令模式
      本篇内容主要讲解“如何理解Java设计模式的命令模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的命令模式”吧!一、什么是命令模式命令模式是一个高内聚的模式,其定义为:...
      99+
      2023-06-25
    • Java结构型设计模式之组合模式详解
      目录组合模式应用场景优缺点主要角色组合模式结构分类透明组合模式创建抽象根节点创建树枝节点创建叶子节点客户端调用安全组合模式创建抽象根节点创建树枝节点创建叶子节点客户端调用组合模式 组...
      99+
      2024-04-02
    • Golang设计模式之组合模式讲解
      目录组合模式概念示例组合模式 组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。 对于绝大多数需要生成树状结构的问题来说, 组合都是非...
      99+
      2023-01-14
      Go组合模式 Go组合模式
    • 如何理解Java设计模式的解释器模式
      本篇内容主要讲解“如何理解Java设计模式的解释器模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的解释器模式”吧!一、什么是解释器模式定义:给定一个语言,定义一个文法...
      99+
      2023-06-25
    • JavaScript设计模式组合设计模式案例
      目录前言组合设计模式的业务场景组合设计模式小案例前言 组合设计模式是用于将多个部分通过组合的方式行成一个整体,就比如我们去吃饭,点了一份米饭和一份鱼香肉丝,这些东西可以看成一个部分,...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作