国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 組合模式

這篇具有很好參考價(jià)值的文章主要介紹了c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 組合模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??簡(jiǎn)介

????????組合模式又名部分整體模式,是一種 結(jié)構(gòu)型設(shè)計(jì)模式 ,是用于把一組相似的對(duì)象當(dāng)作一個(gè) 單一的對(duì)象 。組合模式 依據(jù)樹形結(jié)構(gòu)來(lái)組合對(duì)象 ,用來(lái)表示部分以及整體層,它可以讓你將對(duì)象組合成樹形結(jié)構(gòu),并且能 像使用獨(dú)立對(duì)象一樣使用它們 。這種模式定義了包含人和組的類,每個(gè)組都可以包含人或者是其他的組。這樣的結(jié)構(gòu)可以有效地代表大的和復(fù)雜的層次結(jié)構(gòu)。

?c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 組合模式,c#設(shè)計(jì)模式,c#,.netcore,設(shè)計(jì)模式,組合模式

? ? ? ? ??如上圖,是我們常見的 文件系統(tǒng) ,對(duì)于這樣的結(jié)構(gòu)我們稱之為 樹形結(jié)構(gòu) 。在樹形結(jié)構(gòu)中可以通過(guò)調(diào)用某個(gè)方法來(lái)遍歷整個(gè)樹,當(dāng)我們找到某個(gè)葉子節(jié)點(diǎn)后,就可以對(duì)葉子節(jié)點(diǎn)進(jìn)行相關(guān)的操作。可以將這顆樹理解成一個(gè)大的容器, 容器 里面 包含很多的成員對(duì)象 ,這些成員對(duì)象即可是容器對(duì)象也可以是葉子對(duì)象。但是由于容器對(duì)象和葉子對(duì)象在功能上面的區(qū)別,使得我們?cè)谑褂玫倪^(guò)程中必須要區(qū)分容器對(duì)象和葉子對(duì)象,但是這樣就會(huì)給客戶帶來(lái)不必要的麻煩,作為客戶而已,它始終希望能夠一 致的對(duì)待容器對(duì)象和葉子對(duì)象 。

??角色

組合模式主要包含三種角色:
  1. 抽象根節(jié)點(diǎn)(Component):定義系統(tǒng)各層次對(duì)象的共有方法和屬性,可以預(yù)先定義一些默認(rèn)行為和屬性。
  2. 樹枝節(jié)點(diǎn)(Composite):定義樹枝節(jié)點(diǎn)的行為,存儲(chǔ)子節(jié)點(diǎn),組合樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)形成一個(gè)樹形結(jié)構(gòu)。
  3. 葉子節(jié)點(diǎn)(Leaf):葉子節(jié)點(diǎn)對(duì)象,其下再無(wú)分支,是系統(tǒng)層次遍歷的最小單位。

??與我們上圖中文件系統(tǒng)圖例對(duì)應(yīng)

  • 抽象根節(jié)點(diǎn) = 最頂部的文件夾
  • 樹枝節(jié)點(diǎn) = 文件夾
  • 葉子節(jié)點(diǎn) = 文件

??案例

不管是菜單還是菜單項(xiàng),都應(yīng)該繼承自統(tǒng)一的接口,這里我們創(chuàng)建一個(gè)抽象組件,定義一些通用的方法,如添加,刪除,打印。

public abstract class Component
{
    protected string _name;

    public Component(string name)
    {
        _name = name;
    }

    public abstract void Add(Component c);
    public abstract void Remove(Component c);
    public abstract void Display(int depth);
}

??樹枝節(jié)點(diǎn)Composite

定義一個(gè)名為children的List類型的列表,用于存儲(chǔ)Component類型的子元素,Add方法和Remove方法分別用于向children列表中添加和移除Component類型的對(duì)象。Display方法用于顯示Composite對(duì)象的信息。這個(gè)方法首先打印出當(dāng)前Composite對(duì)象的深度和名稱,然后遍歷children列表,對(duì)每個(gè)子元素調(diào)用Display方法。這樣就形成了一種遞歸的結(jié)構(gòu),可以用來(lái)表示樹形結(jié)構(gòu)。

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 Remove(Component component)
    {
        children.Remove(component);
    }

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

        foreach (Component component in children)
        {
            component.Display(depth + 2);
        }
    }
}

??葉子節(jié)點(diǎn)Leaf

因?yàn)槿~子節(jié)點(diǎn)已經(jīng)是最下級(jí)了,因此我們只需要在Display直接重寫打印方法,并且不需要再進(jìn)行遍歷了

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

    public override void Add(Component c)
    {
        Console.WriteLine("Cannot add to a leaf");
    }

    public override void Remove(Component c)
    {
        Console.WriteLine("Cannot remove from a leaf");
    }

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

??測(cè)試

class MyClass
{
    public static void Main(string[] args)
    {
        // 創(chuàng)建一個(gè)根節(jié)點(diǎn)
        Component root = new Composite("root");
        // 創(chuàng)建兩個(gè)節(jié)點(diǎn)
        Component node1 = new Composite("node1");
        Component node2 = new Composite("node2");
        // 創(chuàng)建葉子節(jié)點(diǎn)
        Component leaf1 = new Leaf("leaf1");
        Component leaf2 = new Leaf("leaf2");
        Component leaf3 = new Leaf("leaf3");

        // 構(gòu)建樹形結(jié)構(gòu)
        root.Add(node1);
        root.Add(node2);
        node1.Add(leaf1);
        node2.Add(leaf2);
        node2.Add(leaf3);

        // 顯示樹形結(jié)構(gòu)
        root.Display(1);
    }
}

運(yùn)行結(jié)果!在這個(gè)例子中,我們首先創(chuàng)建了一個(gè)根節(jié)點(diǎn)root,然后創(chuàng)建了兩個(gè)節(jié)點(diǎn)node1node2,以及三個(gè)葉子節(jié)點(diǎn)leaf1leaf2leaf3。然后我們將node1node2添加到root下,將leaf1添加到node1下,將leaf2leaf3添加到node2下,從而構(gòu)建了一個(gè)樹形結(jié)構(gòu)。

c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 組合模式,c#設(shè)計(jì)模式,c#,.netcore,設(shè)計(jì)模式,組合模式

??總結(jié)

??優(yōu)點(diǎn)

  1. 組合模式可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次,它讓客戶端忽略了層次的差異,方便對(duì)整個(gè)層次結(jié)構(gòu)進(jìn)行控制。
  2. 客戶端可以一致地使用一個(gè)組合結(jié)構(gòu)或其中單個(gè)對(duì)象,不必關(guān)心處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu),簡(jiǎn)化了客戶端代碼。
  3. 在組合模式中增加新的樹枝節(jié)點(diǎn)和葉子節(jié)點(diǎn)都很方便,無(wú)須對(duì)現(xiàn)有類庫(kù)進(jìn)行任何修改,符合開閉原則。
  4. 組合模式為樹形結(jié)構(gòu)的面向?qū)ο髮?shí)現(xiàn)提供了一種靈活的解決方案,通過(guò)葉子節(jié)點(diǎn)和樹枝節(jié)點(diǎn)的遞歸組合,可以形成復(fù)雜的樹形結(jié)構(gòu),但對(duì)樹形結(jié)構(gòu)的控制卻非常簡(jiǎn)單。

??缺點(diǎn)

????????在使用組合模式時(shí),其葉子和樹枝的聲明都是實(shí)現(xiàn)類,而不是接口,違反了依賴倒置原則。

??使用場(chǎng)景

????????組合模式正是應(yīng)樹形結(jié)構(gòu)而生,所以組合模式的使用場(chǎng)景就是出現(xiàn)樹形結(jié)構(gòu)的地方。比如:文件目錄顯示,多級(jí)目錄呈現(xiàn)等樹形結(jié)構(gòu)數(shù)據(jù)的操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729327.html

到了這里,關(guān)于c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 組合模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、基本實(shí)現(xiàn) 4.2、菜單遍歷? 五、總結(jié)? 組合模式(Composite Pattern)又叫部分-整體模式,它通過(guò)將對(duì)象組合成樹形結(jié)構(gòu)來(lái)表示“整體-部分”的層次關(guān)系,允許用戶統(tǒng)一單個(gè)對(duì)象和組合對(duì)象的處理邏輯。 角色 描述

    2024年02月16日
    瀏覽(25)
  • 【結(jié)構(gòu)型設(shè)計(jì)模式】C#設(shè)計(jì)模式之橋接模式

    題目:設(shè)計(jì)一個(gè)橋接模式來(lái)實(shí)現(xiàn)圖形和顏色之間的解耦。 解析: 橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它將抽象部分與實(shí)現(xiàn)部分分離,使它們可以獨(dú)立變化。在這個(gè)例子中,抽象部分是圖形(如圓形、正方形),實(shí)現(xiàn)部分是顏色(如紅色、藍(lán)色)。 我們可以使用橋接模式來(lái)解耦

    2024年02月13日
    瀏覽(30)
  • c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 橋接模式

    c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 橋接模式

    ????????橋接模式是一種設(shè)計(jì)模式,它將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。這種模式涉及到一個(gè)接口作為橋梁,使實(shí)體類的功能獨(dú)立于接口實(shí)現(xiàn)類。這兩種類型的類可以結(jié)構(gòu)化改變而互不影響。 ????????橋接模式的主要目的是通過(guò)將實(shí)現(xiàn)和抽象分離,使兩者可以

    2024年02月12日
    瀏覽(20)
  • c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 代理模式

    c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 代理模式

    ????????由于某些原因需要給某對(duì)象提供一個(gè)代理以控制對(duì)該對(duì)象的訪問(wèn)。這時(shí),訪問(wèn)對(duì)象不適合或者不能直接 引用目標(biāo)對(duì)象,代理對(duì)象作為訪問(wèn)對(duì)象和目標(biāo)對(duì)象之間的中介。在學(xué)習(xí)代理模式的時(shí)候,可以去了解一下Aop切面編程AOP切面編程_aop編程_愛吃香蕉的阿豪的博客

    2024年02月12日
    瀏覽(24)
  • c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 外觀模式

    c#設(shè)計(jì)模式-結(jié)構(gòu)型模式 之 外觀模式

    ?????????外觀模式(Facade Pattern)又名門面模式,隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個(gè)客戶端可以訪問(wèn)系統(tǒng)的接口。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來(lái)隱藏系統(tǒng)的復(fù)雜性。該模式對(duì)外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)

    2024年02月11日
    瀏覽(19)
  • 【結(jié)構(gòu)型設(shè)計(jì)模式】C#設(shè)計(jì)模式之享元模式

    享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在通過(guò)盡可能共享對(duì)象來(lái)減少內(nèi)存使用和提高性能。它將對(duì)象分為兩種類型:內(nèi)部狀態(tài)(Intrinsic State)和外部狀態(tài)(Extrinsic State)。內(nèi)部狀態(tài)是可以共享的,而外部狀態(tài)是獨(dú)立于享元對(duì)象的,并且在使用時(shí)需要注入。 使用

    2024年02月13日
    瀏覽(27)
  • 設(shè)計(jì)模式--------結(jié)構(gòu)型模式

    設(shè)計(jì)模式--------結(jié)構(gòu)型模式

    結(jié)構(gòu)型模式描述如何將類或?qū)ο蟀茨撤N布局組成更大的結(jié)構(gòu)。它分為類結(jié)構(gòu)型模式和對(duì)象結(jié)構(gòu)型模式,前者采用繼承機(jī)制來(lái)組織接口和類,后者釆用組合或聚合來(lái)組合對(duì)象。 由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對(duì)象結(jié)構(gòu)型模式比類結(jié)構(gòu)

    2024年02月13日
    瀏覽(30)
  • 設(shè)計(jì)模式結(jié)構(gòu)型——外觀模式

    設(shè)計(jì)模式結(jié)構(gòu)型——外觀模式

    目錄 什么是外觀模式 外觀模式的實(shí)現(xiàn) 外觀模式角色 外觀模式舉例 外觀模式類圖 外觀模式代碼實(shí)現(xiàn) 外觀模式的特點(diǎn) 優(yōu)點(diǎn) 缺點(diǎn) 注意事項(xiàng) 應(yīng)用場(chǎng)景 總結(jié) ????????外觀模式(Facade Pattern):又叫作門面模式,歸屬于結(jié)構(gòu)型模式。外觀模式定義了提供了定義了一個(gè)統(tǒng)一的高層

    2024年02月16日
    瀏覽(26)
  • 結(jié)構(gòu)型設(shè)計(jì)模式——橋接模式

    結(jié)構(gòu)型設(shè)計(jì)模式——橋接模式

    橋接模式(Bridge pattern): 使用橋接模式通過(guò)將實(shí)現(xiàn)和抽象放在兩個(gè)不同的類層次中而使它們可以獨(dú)立改變。 橋接模式 (Bridge) 是一種結(jié)構(gòu)型設(shè)計(jì)模式, 可將 抽象 部分與 實(shí)現(xiàn) 部分 分離 ,使它們都可以獨(dú)立的變化。如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更

    2024年02月07日
    瀏覽(34)
  • 設(shè)計(jì)模式之結(jié)構(gòu)型模式

    設(shè)計(jì)模式之結(jié)構(gòu)型模式

    本文已收錄于專欄 《設(shè)計(jì)模式》 ??大話設(shè)計(jì)模式主要分為三部分,第一部分是創(chuàng)建型模式,第二部分是結(jié)構(gòu)型模式,第三部分是行為型模式。至于為什么要分為這三部分,我的理解是創(chuàng)建型是用于創(chuàng)建對(duì)象的而結(jié)構(gòu)型是發(fā)生在類與類之間的關(guān)系是比較宏觀的,比如說(shuō)組合

    2024年02月11日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包