iOS設(shè)計模式解析筆記(Day1) -- 對象組合與類繼承及類圖表示(預(yù)熱)

寫讀書筆記只是為了記錄自己學(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í)例變量放在框的底部. 具體如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112533163屏幕快照 2016-11-25 下午7.02.06.png)

分類的表示方法:
![](http://oh73tojig.bkt.clouddn.com/2016112595585屏幕快照 2016-11-25 下午7.45.40.png)
原來的類在左邊, 右邊附在其上的是分類, 分類名用括號括起來. 增加的操作放在狂徒的下部.

2. 實(shí)例化 (不懂)

如果要表示一個類創(chuàng)建了另一個類, 用帶有箭頭的虛線來表示這種關(guān)系. 這種被稱為"創(chuàng)建"關(guān)系. 箭頭指向被實(shí)例化的類, 如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112538149屏幕快照 2016-11-25 下午7.53.46.png)

3. 繼承

類繼承的OMT圖示法用空心三角形將子類連接到其父類. 對于接口繼承, 也才用類似的表示方法, 只是箭頭后面的是虛線. 如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112559412屏幕快照 2016-11-25 下午7.56.45.png)

4. 相識 (不懂)

使用一個類指向另一個類的箭頭來表示相識(acquaintance)關(guān)系.
![](http://oh73tojig.bkt.clouddn.com/2016112593928屏幕快照 2016-11-25 下午8.03.32.png)
concreteClass擁有AnotherClass對象的引用, 但不 "擁有" AnotherClass對象的實(shí)體, 而且引用也可以被其他對象分享. 簡單的說, ConcreteClass "認(rèn)識" AnotherClass.

5. 聚合(不懂)

跟相識關(guān)系一樣, 也使用箭頭來表示對另一個對象的引用, 只是在箭頭的根部有一個菱形. 但這種引用關(guān)系有些不同. 如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112544579屏幕快照 2016-11-25 下午8.08.41.png)
ConcreteClass與AnotherClass有聚合(aggregation)關(guān)系.
AnotherClass是ConcreteClass的一部分, ConcreteClass與AnotherClass構(gòu)成聚合體.
而聚合體由ConcreteClass來表示, AnotherClass不是聚合體.圖中還顯示了引用的另一種屬性.
雙箭頭表示 "多于一個". 因此, ConcreteClass包含AnotherClass的多個實(shí)例, 即instanceVariable_.

6. 偽代碼

有時候用偽代碼簡要記述某些操作的實(shí)現(xiàn), 可以更清楚地說明模式. 偽代碼注記的正文放在帶卷角的矩形框中, 如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112527397屏幕快照 2016-11-25 下午8.19.09.png)

對象圖表示

對象圖只用來表示對象之間的關(guān)系, 它表示了設(shè)計模式中各個對象之間如何相互聯(lián)系.
對象名使用"aSomeClass"的格式, 這里SomeClass是對象的類, 表示對象的圖形與類圖中用到的很相似.
對象被放在一個圓角矩形中, 矩形框有兩部分, 將對象名和它的對象引用分開. 根部為圓形的實(shí)心箭頭指向被引用的其他對象.如圖:
![](http://oh73tojig.bkt.clouddn.com/2016112515564屏幕快照 2016-11-25 下午8.24.43.png)

八個功能部分21種設(shè)計模式

  • 對象創(chuàng)建
  1. 原型
  2. 工廠方法
  3. 抽象工廠
  4. 生成器
  5. 單例
  • 接口適應(yīng)
  1. 適配器
  2. 橋接
  3. 外觀
  • 對象去耦合
  1. 中介者
  2. 觀察者
  • 抽象集合
  1. 組合
  2. 迭代器
  • 行為擴(kuò)展
  1. 訪問者
  2. 裝飾
  3. 責(zé)任鏈
  • 算法封裝
  1. 模板方法
  2. 策略
  3. 命令
  • 性能與對象訪問
  1. 享元
  2. 代理
  • 對象狀態(tài)
  1. 備忘錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容