
寫讀書筆記只是為了記錄自己學(xué)習(xí)的過程,
并且也希望通過以這樣的形式跟大神學(xué)習(xí),
里面還有很多我不太懂的地方,
也希望大神幫我解答, 小弟在此謝過.
針對接口編程, 而不是針對實(shí)現(xiàn)編程.
對象組合與類繼承
1. 類繼承的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 類繼承簡單直接, 因?yàn)殛P(guān)系在編譯時靜態(tài)定義;
- 被復(fù)用的實(shí)現(xiàn)易于修改;
缺點(diǎn):
- 因?yàn)轭惱^承在編譯時定義, 所以無法再運(yùn)行時變更從父類繼承來的實(shí)現(xiàn);
- 子類的部分描述常常定義在父類中;
- 子類直接面對父類實(shí)現(xiàn)的細(xì)節(jié), 破壞了封裝;
- 父類實(shí)現(xiàn)的任何變革都會強(qiáng)制子類也進(jìn)行變更, 因?yàn)樗麄兊膶?shí)現(xiàn)聯(lián)系在了一起;
- 因?yàn)樵谛碌膯栴}場景下繼承來的實(shí)現(xiàn)已過時或不適用, 所以必須重寫父類或繼承來的實(shí)現(xiàn);
2. 對象組合的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 不會破壞封裝, 因?yàn)橹煌ㄟ^接口來訪問對象;
- 大大減少實(shí)現(xiàn)的依存關(guān)系, 因?yàn)閷ο蟮膶?shí)現(xiàn)是通過接口來定義的;
- 可以在運(yùn)行時將任意對象替換為其他同類型的對象;
- 有助于保持類的封裝以專注于單一任務(wù);
- 類及其層次結(jié)構(gòu)能保持簡潔, 不至于過度膨脹而無法管理;
缺點(diǎn):
- 設(shè)計中涉及較多的對象;
- 系統(tǒng)的行為將依賴于不同的對象間的關(guān)系, 而不是定義于單個類中;
- 理想的情況下, 不需要創(chuàng)建新的組件就能得到所需的全部功能, 實(shí)際上, 現(xiàn)成的組件總是不太夠用;
建議: 優(yōu)先使用對象組合而不是類繼承
類圖表示
類圖用來說明類與類之間的靜態(tài)關(guān)系和類的結(jié)構(gòu). Objective-C中, 應(yīng)用程序可以定義協(xié)議, (抽象)類以及分類.
1. 協(xié)議, 抽象類, 具體類和分類
通常, 用圓角矩形框表示類實(shí)體, 在上部用粗體標(biāo)出名字, 下部是操作的名字.
抽象的名字用斜體表示, 因此協(xié)議和抽象類用粗斜體表示.
協(xié)議名用尖括號括起來, 實(shí)例變量放在框的底部. 具體如圖:

分類的表示方法:

原來的類在左邊, 右邊附在其上的是分類, 分類名用括號括起來. 增加的操作放在狂徒的下部.
2. 實(shí)例化 (不懂)
如果要表示一個類創(chuàng)建了另一個類, 用帶有箭頭的虛線來表示這種關(guān)系. 這種被稱為"創(chuàng)建"關(guān)系. 箭頭指向被實(shí)例化的類, 如圖:

3. 繼承
類繼承的OMT圖示法用空心三角形將子類連接到其父類. 對于接口繼承, 也才用類似的表示方法, 只是箭頭后面的是虛線. 如圖:

4. 相識 (不懂)
使用一個類指向另一個類的箭頭來表示相識(acquaintance)關(guān)系.

concreteClass擁有AnotherClass對象的引用, 但不 "擁有" AnotherClass對象的實(shí)體, 而且引用也可以被其他對象分享. 簡單的說, ConcreteClass "認(rèn)識" AnotherClass.
5. 聚合(不懂)
跟相識關(guān)系一樣, 也使用箭頭來表示對另一個對象的引用, 只是在箭頭的根部有一個菱形. 但這種引用關(guān)系有些不同. 如圖:

ConcreteClass與AnotherClass有聚合(aggregation)關(guān)系.
AnotherClass是ConcreteClass的一部分, ConcreteClass與AnotherClass構(gòu)成聚合體.
而聚合體由ConcreteClass來表示, AnotherClass不是聚合體.圖中還顯示了引用的另一種屬性.
雙箭頭表示 "多于一個". 因此, ConcreteClass包含AnotherClass的多個實(shí)例, 即instanceVariable_.
6. 偽代碼
有時候用偽代碼簡要記述某些操作的實(shí)現(xiàn), 可以更清楚地說明模式. 偽代碼注記的正文放在帶卷角的矩形框中, 如圖:

對象圖表示
對象圖只用來表示對象之間的關(guān)系, 它表示了設(shè)計模式中各個對象之間如何相互聯(lián)系.
對象名使用"aSomeClass"的格式, 這里SomeClass是對象的類, 表示對象的圖形與類圖中用到的很相似.
對象被放在一個圓角矩形中, 矩形框有兩部分, 將對象名和它的對象引用分開. 根部為圓形的實(shí)心箭頭指向被引用的其他對象.如圖:

八個功能部分21種設(shè)計模式
- 對象創(chuàng)建
- 原型
- 工廠方法
- 抽象工廠
- 生成器
- 單例
- 接口適應(yīng)
- 適配器
- 橋接
- 外觀
- 對象去耦合
- 中介者
- 觀察者
- 抽象集合
- 組合
- 迭代器
- 行為擴(kuò)展
- 訪問者
- 裝飾
- 責(zé)任鏈
- 算法封裝
- 模板方法
- 策略
- 命令
- 性能與對象訪問
- 享元
- 代理
- 對象狀態(tài)
- 備忘錄