結(jié)構(gòu)模式之Composite——合成(部分-整體)模式

          1、簡介
             
          結(jié)構(gòu)模式將對象以樹形結(jié)構(gòu)組織起來,以達(dá)成部分-整體的層次結(jié)構(gòu),使得客戶端對單個(gè)對象和組合對象的使用具有一致性。結(jié)構(gòu)模式有時(shí)候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復(fù)雜元 素的概念,客戶程序可以向處理簡單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。

             
          合成模式的實(shí)現(xiàn)根據(jù)所實(shí)現(xiàn)接口的區(qū)別分為兩種形式,分別稱為安全模式透明模式。合成模式可以不提供父對象的管理方法,但合成模式必須在合適的地方提供子對象的管理方法(諸如:addremovegetChild等)。

             
          透明方式
             
          作為第一種選擇,在Component里面聲明所有的用來管理子類對象的方法,包括add()remove(),以及getChild()方法。這樣做 的好處是所有的構(gòu)件類都有相同的接口。在客戶端看來,樹葉類對象與合成類對象的區(qū)別起碼在接口層次上消失了,客戶端可以同等同的對待所有的對象。這就是透 明形式的合成模式。
             
          這個(gè)選擇的缺點(diǎn)是不夠安全,因?yàn)闃淙~類對象和合成類對象在本質(zhì)上是有區(qū)別的。樹葉類對象不可能有下一個(gè)層次的對象,因此add()remove()以及getChild()方法沒有意義,是在編譯時(shí)期不會出錯(cuò),而只會在運(yùn)行時(shí)期才會出錯(cuò)。

             
          安全方式
             
          第二種選擇是在Composite類里面聲明所有的用來管理子類對象的方法。這樣的做法是安全的做法,因?yàn)闃淙~類型的對象根本就沒有管理子類對象的方法,因此,如果客戶端對樹葉類對象使用這些方法時(shí),程序會在編譯時(shí)期出錯(cuò)。
             
          這個(gè)選擇的缺點(diǎn)是不夠透明,因?yàn)闃淙~類和合成類將具有不同的接口。

             
          這兩個(gè)形式各有優(yōu)缺點(diǎn),需要根據(jù)軟件的具體情況做出取舍決定。

          2
          、使用場景及能解決的問題
             
          需要描述對象的部分和整體的等級結(jié)構(gòu)。
             
          需要客戶端忽略掉個(gè)體構(gòu)件和組合構(gòu)件的區(qū)別。客戶端必須平等對待所有的構(gòu)件,包括個(gè)體構(gòu)件和組合構(gòu)件。
             
          下面看一個(gè)實(shí)際的例子:算術(shù)表達(dá)式。算術(shù)表達(dá)式包括操作數(shù)、操作符和另一個(gè)操作數(shù)。操作數(shù)可以是數(shù)字,也可以是另一個(gè)表達(dá)式。這樣,2+3和(2+3+4*6)都是合法的表達(dá)式。


           3、類圖


              下面看看兩種不同的實(shí)現(xiàn)方式的合成模式對應(yīng)的類圖

               安全方式:


               透明方式:


          4、優(yōu)缺點(diǎn)

              優(yōu)點(diǎn):
              合成模式可以很容易地增加新種類的構(gòu)件。
              使用合成模式可以使客戶端變得很容易設(shè)計(jì),因?yàn)榭蛻舳瞬恍枰罉?gòu)件是樹葉構(gòu)件還是樹枝構(gòu)件。
              缺點(diǎn):
              使用合成模式后,控制樹枝構(gòu)件的類型就不太容易。
              用繼承的方法來增加新的行為很困難。

             


          posted on 2008-06-23 22:29 云淡風(fēng)清 閱讀(412) 評論(0)  編輯  收藏 所屬分類: Design Patterns

          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆分類(15)

          隨筆檔案(15)

          收藏夾(1)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 保山市| 宁南县| 宽甸| 黔江区| 金溪县| 天祝| 汝州市| 盐边县| 新晃| 龙井市| 白玉县| 开远市| 田东县| 独山县| 禄丰县| 贵港市| 乐昌市| 玉环县| 江阴市| 阜康市| 林周县| 平阴县| 长阳| 钟山县| 临海市| 屯昌县| 邯郸市| 彭山县| 东乌珠穆沁旗| 乌什县| 威海市| 阳东县| 大荔县| 杨浦区| 高安市| 湛江市| 资兴市| 屏东市| 文水县| 汾阳市| 昌图县|