广告
返回顶部
首页 > 资讯 > 精选 >.Net结构型设计模式之组合模式怎么实现
  • 592
分享到

.Net结构型设计模式之组合模式怎么实现

2023-06-30 16:06:18 592人浏览 八月长安
摘要

今天小编给大家分享一下.net结构型设计模式之组合模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、动机(Mot

今天小编给大家分享一下.net结构型设计模式之组合模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、动机(Motivate)

    在我们的操作系统中有文件夹的概念,文件夹可以包含文件夹,可以嵌套多层,最里面包含的是文件,这个概念和“俄罗斯套娃”很像。当然还有很多的例子,例如我们使用系统的时候,会使用到“系统菜单”,这个东西是树形结构。这些例子包含的这些东西或者说是对象,可以分为两类,一类是:容器对象,可以包含其他的子对象;另一类是:叶子对象,这类对象是不能在包含其他对象的对象了。在软件设计中,我们该怎么处理这种情况呢?是每类对象分别对待,还是提供一个统一的操作方式呢。组合模式给我们提供了一种解决此类问题的一个途径。   

    客户代码过多地依赖于对象容器(对象容器是对象的容器,细细评味)复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等方面的弊端。如何将“客户代码与复杂的对象容器结构”解耦?如何让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?

    二、意图(Intent)

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

    三、结构图(Structure)

    .Net结构型设计模式之组合模式怎么实现

    四、模式的组成

    组合模式中涉及到三个角色:
    (1)、抽象构件角色(Component):这是一个抽象角色,它给参加组合的对象定义出了公共的接口及默认行为,可以用来管理所有的子对象(在透明式的组合模式是这样的)。在安全式的组合模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝结构对象给出。
    (2)、树叶构件角色(Leaf):树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。(原始对象的行为可以理解为没有容器对象管理子对象的方法,或者 【原始对象行为】+【管理子对象的行为(Add,Remove等)】=面对客户代码的接口行为集合
    (3)、树枝构件角色(Composite):代表参加组合的有下级子对象的对象,树枝对象给出所有管理子对象的方法实现,如Add、Remove等。
    组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。

    五、组合模式的具体代码实现

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

    1、透明式的组合模式

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

    /// <summary>/// 该抽象类就是文件夹抽象接口的定义,该类型就相当于是抽象构件Component类型/// </summary>public abstract class Folder{    public abstract void Add(Folder folder);//增加文件夹或文件    public abstract void Remove(Folder folder);//删除文件夹或者文件    public abstract void Open();    //打开文件或者文件夹--该操作相当于Component类型的Operation方法}/// <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文档不具有该功能");    }    public override void Open()//打开文件--该操作相当于Component类型的Operation方法    {        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("文件或者文件夹已经删除成功");    }    public override void Open()//打开文件夹--该操作相当于Component类型的Operation方法    {        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());//成功删除文件或者文件夹    }}

    2、安全式的组合模式

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

    /// <summary>/// 该抽象类就是文件夹抽象接口的定义,该类型就相当于是抽象构件Component类型/// </summary>public abstract class Folder //该类型少了容器对象管理子对象的方法的定义,换了地方,在树枝构件也就是SonFolder类型{    public abstract void Open();  //打开文件或者文件夹--该操作相当于Component类型的Operation方法}/// <summary>/// 该Word文档类就是叶子构件的定义,该类型就相当于是Leaf类型,不能在包含子对象/// </summary>public sealed class Word : Folder  //这类型现在很干净{    public override void Open() //打开文件--该操作相当于Component类型的Operation方法    {        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); //删除文件夹或者文件    public override void Open()//打开文件夹--该操作相当于Component类型的Operation方法    {        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("文件或者文件夹已经删除成功");    }    public override void Open()//打开文件夹--该操作相当于Component类型的Operation方法    {        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());//成功删除文件或者文件夹    }}

    六、组合模式的实现要点:

    Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
    2、将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口&mdash;&mdash;而非对象容器的复杂内部实现结构&mdash;&mdash;发生依赖关系,从而更能“应对变化”。
    3、Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。asp.net控件的实现在这方面为我们提供了一个很好的示范。
    4、Composite模式在具体实现中,可以让父对象中的子对象反向追朔;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。

    组合模式的优点:

    (1)、组合模式使得客户端代码可以一致地处理对象和对象容器,无需关系处理的单个对象,还是组合的对象容器。
    (2)、将”客户代码与复杂的对象容器结构“解耦。
    (3)、可以更容易地往组合对象中加入新的构件。

    组合模式的缺点:

    使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。(这个是几乎所有设计模式所面临的问题)。

    在以下情况下应该考虑使用组合模式:

    (1)、需要表示一个对象整体或部分的层次结构。
    (2)、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    七、.NET 中组合模式的实现

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

    以上就是“.Net结构型设计模式之组合模式怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: .Net结构型设计模式之组合模式怎么实现

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • .Net结构型设计模式之组合模式怎么实现
      今天小编给大家分享一下.Net结构型设计模式之组合模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、动机(Mot...
      99+
      2023-06-30
    • .Net结构型设计模式之组合模式(Composite)
      目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、组合模式的具体代码实现1、透明式的组合模式2、安全式的组合模式六、组合模式的...
      99+
      2022-11-13
    • .Net结构型设计模式之装饰模式怎么实现
      这篇文章主要介绍“.Net结构型设计模式之装饰模式怎么实现”,在日常操作中,相信很多人在.Net结构型设计模式之装饰模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.Net结构型设计模式之装饰模式怎...
      99+
      2023-06-30
    • .Net结构型设计模式之桥接模式怎么实现
      本篇内容介绍了“.Net结构型设计模式之桥接模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、动机(Motivation)在很多...
      99+
      2023-06-30
    • .Net结构型设计模式之代理模式怎么实现
      这篇文章主要介绍了.Net结构型设计模式之代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
      99+
      2023-06-30
    • .Net结构型设计模式之享元模式怎么实现
      这篇文章主要介绍了.Net结构型设计模式之享元模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之享元模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
      99+
      2023-06-30
    • .Net结构型设计模式之适配器模式怎么实现
      本文小编为大家详细介绍“.Net结构型设计模式之适配器模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“.Net结构型设计模式之适配器模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、动机(...
      99+
      2023-06-30
    • .Net结构型设计模式之桥接模式(Bridge)
      目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、桥接模式的具体代码实现六、桥接模式的实现要点:1、桥接模式的优点:2、桥接...
      99+
      2022-11-13
    • .Net结构型设计模式之装饰模式(Decorator)
      目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五 、装饰模式的具体代码实现六、装饰模式的实现要点:1、装饰模式的优点:2、装饰...
      99+
      2022-11-13
    • .Net结构型设计模式之外观模式(Facade)
      目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、外观模式的具体实现六、实现要点:1、外观模式的优点:2、外观模式的缺点:3、...
      99+
      2022-11-13
    • .Net结构型设计模式之享元模式(Flyweight)
      目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、享元模式的具体代码实现六、享元模式的实现要点:1、享元模式的优点2、享元模式...
      99+
      2022-11-13
    • .Net结构型设计模式之代理模式(Proxy)
      目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、代理模式的分类:六、代理模式的具体实现七、代理模式的实现要点:1、代理模式的...
      99+
      2022-11-13
    • Java结构型设计模式之组合模式详解
      目录组合模式应用场景优缺点主要角色组合模式结构分类透明组合模式创建抽象根节点创建树枝节点创建叶子节点客户端调用安全组合模式创建抽象根节点创建树枝节点创建叶子节点客户端调用组合模式 组...
      99+
      2022-11-13
    • PHP结构型模式之组合模式怎么实现
      今天小编给大家分享一下PHP结构型模式之组合模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。组合模式(Compos...
      99+
      2023-07-05
    • Python设计模式结构型组合模式
      目录一、组合模式二、应用场景三、代码示例一、组合模式 组合,将多个对象组合成为一个树状结构,来表示业务逻辑上的层次。组合模式使得用户对单个对象和组合对象的使用具有一致性。 比如,描述...
      99+
      2022-11-13
    • .Net结构型设计模式之适配器模式(Adapter)
      目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)1、对象适配器(更常用)2、类适配器(不推荐使用)四、模式的组成五、 适配器模式的具体实现六...
      99+
      2022-11-13
    • Java结构型设计模式之组合模式CompositePattern详解
      目录概述三大组件应用案例顶层组件OrganizationComponentComposite组件叶子节点客户端测试UML类图总结概述 组合模式(Composite Pattern),...
      99+
      2022-11-13
      Java Composite Pattern Java 组合模式
    • PHP结构型模式之组合模式
      目录组合模式(Composite Pattern)是什么组合模式的优点组合模式的实现组合模式的使用总结组合模式(Composite Pattern)是什么 组合模式是一种结构型模式,...
      99+
      2023-05-14
      PHP结构型模式 PHP组合模式
    • PHP结构型设计模式之桥接模式怎么实现
      本篇内容介绍了“PHP结构型设计模式之桥接模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!桥接模式(Bridge Pattern)...
      99+
      2023-07-05
    • Java结构型设计模式之装饰模式怎么实现
      这篇文章主要介绍“Java结构型设计模式之装饰模式怎么实现”,在日常操作中,相信很多人在Java结构型设计模式之装饰模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java结构型设计模式之装饰模式怎...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作