設(shè)計模式學(xué)習(xí)筆記(九)迭代器和組合模式

定義

迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內(nèi)部的表示.
組合模式允許你將對象組合成樹形來表現(xiàn)"整體/部分"的層次結(jié)構(gòu).組合能讓客戶以一致的方式處理個別對象和對象組合.

要點

  • 迭代器允許訪問聚合的元素,而不需要暴露他的內(nèi)部結(jié)構(gòu).
  • 迭代器將遍歷聚合的工作封裝進一個對象中.
  • 當(dāng)使用迭代器的時候,我們依賴聚合提供遍歷.
  • 迭代器提供了一個通用的接口,讓我們遍歷聚合的項,當(dāng)我們的編碼使用聚合的項時,就可以使用多態(tài)機制.
  • 我們應(yīng)該努力讓一個類只分配一個責(zé)任.
  • 組合模式提供一個結(jié)構(gòu),可同時包容個別對象和組合對象.
  • 組合模式允許客戶對個別對象以及組合對象一視同仁.
  • 組合結(jié)構(gòu)內(nèi)的任意對象稱為組件,組件可以是組合,也可以是葉節(jié)點.
  • 在實現(xiàn)組合模式時,有許多設(shè)計上的初衷.你要根據(jù)需要平衡透明性和安全性.

個人理解

迭代器模式
書中的各種不同菜單的數(shù)據(jù)存儲集合調(diào)用的時候確實頗為困難,我在前面學(xué)習(xí)設(shè)計的時候?qū)W習(xí)到了很多設(shè)計原則,其中很重要的有一點面向接口開發(fā),而不是面向?qū)崿F(xiàn)開發(fā)!那么如何寫才能使我們的上層調(diào)用變得既簡單,可維護性又高呢?
前期作者僅僅是針對集合這一個方面來闡述他的設(shè)計理念,如何讓上層調(diào)用者不用考慮菜單集合的具體實現(xiàn),同時又能夠提高可擴展性來實現(xiàn)功能呢?作者給出了迭代器這個答案,JAVA中許多集合實際上是自身實現(xiàn)了迭代器的,這樣的做法其實在我看來,迭代器就相當(dāng)于使用適配器模式菜單的接口進行統(tǒng)一的適配,方便上層進行調(diào)用.
更深層次的看下去,這樣的做法其實將上層(侍者)菜單進行了解耦,上層根本不知道菜單是如何實現(xiàn)的,同時侍者在創(chuàng)建迭代器的時候其實也利用了多態(tài),我們后期維護的時候在一定修改范圍內(nèi)這個模式是沒有問題的,但例如在菜單中插入子菜單那單單依靠迭代器模式已經(jīng)無法滿足需求了,下面我們來看看組合模式.


組合模式
組合模式利用下圖的這種樹形結(jié)構(gòu),這種結(jié)構(gòu)類似windows的文件夾結(jié)構(gòu),我們可以在任何時候在一個維度對這個集合進行擴展,我們可以添加一個具體的節(jié)點,也可以添加一個對象聚合,如果這些添加的對象和聚合的接口全部是覆寫自父類的接口,那我們就可以像文中那樣一視同仁的對待每一個節(jié)點,因為他們都繼承自一個父類,接口也是相同的.這個時候,我們可以很輕松的利用遞歸來完成對這個的遍歷,這是一種很巧妙地方式.
具體怎么做呢?我們可以在抽象類中寫出覆寫沒有用到所有的接口,在實現(xiàn)中讓他們?nèi)繏伋?code>異常,這在JAVA中是一種很常見的做法,當(dāng)然,我們在OC中這樣直接拋出異常的方法還是過于剛猛和直接,可以用其他一些委婉的做法.這里為什么要將父類全部覆寫上異常呢?原因比較簡單,繼承的子類并不是需要覆寫全部的接口的,那些不需要的接口,就直接使用父類的異常實現(xiàn)就好了,這樣表面上看起來葉節(jié)點和組合其實是一致的.

組合模式示意圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钝吮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖癣籽,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尉辑,死亡現(xiàn)場離奇詭異,居然都是意外死亡贡珊,警方通過查閱死者的電腦和手機茴扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門铃岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人峭火,你說我怎么就攤上這事毁习≈侨拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵纺且,是天一觀的道長纤勒。 經(jīng)常有香客問我,道長隆檀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任粹湃,我火速辦了婚禮恐仑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘为鳄。我一直安慰自己裳仆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布孤钦。 她就那樣靜靜地躺著歧斟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偏形。 梳的紋絲不亂的頭發(fā)上静袖,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音俊扭,去河邊找鬼队橙。 笑死,一個胖子當(dāng)著我的面吹牛萨惑,可吹牛的內(nèi)容都是我干的捐康。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼庸蔼,長吁一口氣:“原來是場噩夢啊……” “哼解总!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姐仅,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤花枫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萍嬉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乌昔,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年壤追,在試婚紗的時候發(fā)現(xiàn)自己被綠了磕道。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡行冰,死狀恐怖溺蕉,靈堂內(nèi)的尸體忽然破棺而出伶丐,到底是詐尸還是另有隱情,我是刑警寧澤疯特,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布哗魂,位于F島的核電站,受9級特大地震影響漓雅,放射性物質(zhì)發(fā)生泄漏录别。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一邻吞、第九天 我趴在偏房一處隱蔽的房頂上張望组题。 院中可真熱鬧,春花似錦抱冷、人聲如沸崔列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵讯。三九已至,卻和暖如春耿眉,著一層夾襖步出監(jiān)牢的瞬間边翼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工鸣剪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讯私,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓西傀,卻偏偏與公主長得像斤寇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拥褂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個實際應(yīng)用:整合工資表數(shù)據(jù)娘锁。 這個項目的背景是這樣的,項目...
    七寸知架構(gòu)閱讀 2,535評論 0 53
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 設(shè)計模式匯總 一饺鹃、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用莫秆、多...
    MinoyJet閱讀 3,922評論 1 15
  • 1 俄羅斯方塊教育我們:如果你合群你就會消失。 2 成年生活的特征之一:你需要安排好時間才敢情緒崩潰悔详。 3 201...
    荀天才閱讀 808評論 8 4
  • 不想你知道我的憂傷镊屎,習(xí)慣寂寞的我,也會被孤獨打敗——
    文二泉閱讀 176評論 0 0