日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

設(shè)計(jì)模式面面觀(11):組合模式(Composite Pa

系統(tǒng) 2528 0

組合模式( Composite - 結(jié)構(gòu)型模式

組合模式是將對(duì)象之間的關(guān)系以數(shù)據(jù)結(jié)構(gòu)中的 2 叉樹表現(xiàn)出來,使得客戶端將單純的元素與復(fù)雜元素同等看待,這樣的話使得用戶在操作不同的子類元素時(shí)可以和根節(jié)點(diǎn)元素一樣操作,在透明模式下即根元素和葉元素公用同一個(gè)接口達(dá)到共同的結(jié)果。組合模式就是解決部分與整體的關(guān)系的一種模式。

如在項(xiàng)目開發(fā)中遇到這樣的一個(gè)需求,要求羅列出系統(tǒng)中所有職責(zé)崗位上的用戶信息(職員名稱和薪水)。這是一個(gè)很簡(jiǎn)單的需求,大多數(shù)程序員都能很輕易的寫出來。跟我們今天講的組合模式有聯(lián)系嗎?當(dāng)然有啦。我們先來看看需求:

我們知道在一個(gè)公司里有很多崗位比如(總經(jīng)理、副總經(jīng)理、銷售部經(jīng)理、財(cái)務(wù)部經(jīng)理,銷售員,財(cái)務(wù)員。。。。)把公司里的所有職員按照所在崗位劃分出來,我們先來歸類,銷售員歸銷售部經(jīng)理管,財(cái)務(wù)員歸財(cái)務(wù)部經(jīng)理管,銷售部經(jīng)理、財(cái)務(wù)部經(jīng)理歸副總經(jīng)理管,副總經(jīng)理歸總經(jīng)理管。這樣我們不難想想出這樣的結(jié)構(gòu)圖:

設(shè)計(jì)模式面面觀(11):組合模式(Composite Pattern)-結(jié)構(gòu)型模式 <shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 163.5pt; HEIGHT: 276pt" type="#_x0000_t75" o:ole=""><imagedata src="file:///C:%5CDOCUME~1%5CWensi%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.emz" o:title=""></imagedata></shape> (圖 1

依據(jù)圖 1 我們用面向?qū)ο蟮恼Z(yǔ)言來描述他(這里我簡(jiǎn)單的畫了一個(gè)關(guān)系圖并不是把所有公司部門都羅列出來,只是列舉了其中的一些列子)。

大家看了下面圖可能有點(diǎn)奇怪,怎么那么多部門都沒有了呢,只有一個(gè) boss employees 呢?

<shape id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 378pt" type="#_x0000_t75"><imagedata src="file:///C:%5CDOCUME~1%5CWensi%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png" o:title="EmployeeDiagram"></imagedata></shape>

首先:不管你是什么職位在哪個(gè)崗位在公司這個(gè)大背景下(容器)所有人都是公司的一個(gè)部分,所以我們抽象出一個(gè)職員的抽象類 Employee 。對(duì)于職員來說他們的上級(jí)主管都是他們的大 BOSS (老板)因?yàn)槟闶锹爮乃恼{(diào)配的所以在我們這里只把他們抽象出來一個(gè) Boss Employees Employees 是頁(yè)節(jié)點(diǎn)所以子集的因?yàn)槁毼簧蠜]有什么是底層職工的下級(jí),而 Boss 不同 0 到多個(gè)下屬 Employee (因?yàn)樗南聦儆锌赡芤彩且粋€(gè)小 Boss 或是 Employees )。

其次:每個(gè)部門都有負(fù)責(zé)人,對(duì)應(yīng)每個(gè)崗位上的員工都有他們自己的 Boss

那么我們的目的就是把這些人一個(gè)個(gè)的劃分到指定的部分中去。我們定義一個(gè)接口 IComposite 他專門為 boss 收集他的子職員。(注意:這里我只在 boss 類這里繼承了這個(gè)接口規(guī)范而 Employees 并沒有此接口,這里我用了安全的組合模式,還有一種是 Employees 也繼承此接口這時(shí)這個(gè)模式是透明的組合模式用戶對(duì)用戶來說他們只需調(diào)用接口就可以不用估計(jì)是老板還是職員,但這也帶來了負(fù)面影響因?yàn)? Employees 是沒有下屬的所有這里的接口通常是不用實(shí)現(xiàn)的,所以可能在調(diào)用是出現(xiàn)運(yùn)行時(shí)錯(cuò)誤所以是不安全的,而前者只有 Boss 才有此接口所有這種模式是類型安全的組合模式,到底需要用哪一個(gè)這需要在實(shí)際開發(fā)中仔細(xì)考慮的。)

讓我們回頭看看這個(gè) OOD 設(shè)計(jì)是否合理,我們依據(jù)我們第二章的設(shè)計(jì)模式原則來判定

1. 是否符合開閉原則

我們?cè)谛略鲆环N Employee 類型是如果他不是頁(yè)節(jié)點(diǎn)那么只需要實(shí)現(xiàn) IComposite 接口用戶就可以直接使用所有對(duì)內(nèi)是不要修改原有代碼,對(duì)外是可擴(kuò)展的。

答案:符合

2. 是否符合里氏代換原則

Boss Employees 都繼承與 Employee

答案:符合

3. 是否符合抽象原則

答案:符合

4. 是否符合迪米特法則

答案:符合

總結(jié) :組合模式

意圖

將對(duì)象組合成樹形結(jié)構(gòu)以表示“整體 - 部分”的層次結(jié)構(gòu)。 Composite 使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性

動(dòng)機(jī)

客戶代碼過多的依賴于對(duì)象容器復(fù)雜的內(nèi)部實(shí)現(xiàn)結(jié)構(gòu),對(duì)象容器內(nèi)部實(shí)現(xiàn)結(jié)構(gòu)(非抽象接口)的變化將引起客戶代碼的頻繁變化代碼的代碼維護(hù)和擴(kuò)展的困難,我們需要將客戶代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)解偶。

適用性

l 想表示對(duì)象的部分 - 整體層次結(jié)構(gòu)

l 希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

結(jié)構(gòu)

設(shè)計(jì)模式面面觀(11):組合模式(Composite Pattern)-結(jié)構(gòu)型模式

<shape id="_x0000_i1027" style="WIDTH: 179.25pt; HEIGHT: 114pt" type="#_x0000_t75" alt=""><imagedata src="file:///C:%5CDOCUME~1%5CWensi%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.gif" o:><font face="Times New Roman" size="3"></font></imagedata></shape>

參與者

l 抽象構(gòu)件( Component )角色 IComposite

l 樹葉構(gòu)件( Leaf )角色 ( Employees )

l 樹枝構(gòu)件 (Boss)

Composite 模式的優(yōu)點(diǎn)

1. 客戶代碼不依賴復(fù)雜對(duì)象本身的結(jié)構(gòu)變化

2. 用戶不需要特別關(guān)心復(fù)雜對(duì)象的具體結(jié)構(gòu)只要等同于根對(duì)象操作

代碼

http://download.csdn.net/source/360701

設(shè)計(jì)模式面面觀(11):組合模式(Composite Pattern)-結(jié)構(gòu)型模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 昌平区| 闻喜县| 昆明市| 百色市| 托克托县| 安多县| 济源市| 阳山县| 阿城市| 柞水县| 胶南市| 宁津县| 顺平县| 大竹县| 来安县| 平乐县| 遵化市| 峡江县| 连平县| 江安县| 绩溪县| 襄樊市| 六盘水市| 元氏县| 固安县| 怀仁县| 安徽省| 松滋市| 望城县| 新安县| 黑河市| 乐亭县| 盐源县| 金乡县| 苏尼特右旗| 土默特右旗| 晋州市| 宜昌市| 庆阳市| 浦江县| 奇台县|