天天看點

《設計模式解析(第2版•修訂版)》—第1章 1.7節面向對象程式設計實踐

本節書摘來自異步社群《設計模式解析(第2版•修訂版)》一書中的第1章,第1.7節面向對象程式設計實踐,作者【美】alan shalloway(艾倫•沙洛維) , james r.trott(詹姆斯•r.特羅特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

1.7 面向對象程式設計實踐

設計模式解析(第2版•修訂版)

我們再次考察一下本章開始讨論的形狀執行個體。怎樣用面向對象的方式實作它呢?請記住,我們必須完成以下任務。

1.在資料庫中找到形狀清單。

2.打開形狀清單。

3.按某種規則将清單排序。

4.在顯示器上顯示各個形狀。

為了用面向對象方式解決這個問題,我需要定義一些對象和這些對象具有的責任。

在shape程式中使用對象

所需要的對象如下表所示。

《設計模式解析(第2版•修訂版)》—第1章 1.7節面向對象程式設計實踐

運作程式

現在主程式的步驟應該與下面給出的類似。

1.主程式建立一個資料庫(shapedatabase)對象的執行個體。

2.主程式要求資料庫對象找到我感興趣的一組形狀,然後執行個體化一個儲存這些形狀的collection對象(實際上,它還将執行個體化collection對象中存放的circle對象和square對象)。

3.主程式要求collection對象将所存放的形狀排序。

4.主程式要求collection對象顯示形狀。

5.collection對象要求所存放的所有形狀顯示自己。

6.每個形狀根據形狀種類顯示自己(使用display對象)。

為什麼這有助于應對新需求

我們來看這個方案怎麼會有助于我們應對新的需求(請記住,需求總在變化)。例如,考慮如下的新需求。

增加新種類的形狀(例如三角形)。為了引入一種新的形狀,隻需兩步:

建立shape類的一個新的派生類,來定義這個新形狀;

在新的派生類中,實作與該形狀對應的display方法。

修改排序算法。為了修改形狀排序方法,隻需一步:

修改collection的sort方法。這樣所有形狀都将使用新算法。

結論:面向對象方法有效地限制了需求變更所帶來的影響。

再談封裝

封裝有幾個優點。“對使用者隐藏”這一事實直接蘊涵了以下優點。

使用更容易,因為使用者不需要再操心實作問題了。

可以在不考慮調用者的情況下修改實作。(因為調用者從一開始就不知道對象是如何實作的,它們之間不應該存在任何依賴關系。請記住,在維護中時間往往花在了解和留心這些依賴關系上,而不是實際添加新功能。)

其他對象對該對象内部是未知的——這些外部對象往往用來幫助實作該對象接口所指定的功能。

優點:減少副作用

最後,考慮功能改變時引起的不良副作用問題。這種bug通過封裝有效地解決了。對象内部對于其他對象是未知的。如果使用封裝,并遵循“對象自己負責自己”的政策,那麼唯一能影響對象的辦法就是調用該對象的方法。對象的資料和實作其責任的方式都與其他對象所帶來的變化屏蔽開來。

封裝拯救了我們

對象對自己行為所負的責任越多,控制程式需要負的責任就越少。

封裝使對象内部行為的變化對其他對象變得透明了1。

封裝有助于防止不良副作用。

值得注意的是封裝與耦合的關系。封裝什麼東西時,必然将使其耦合變松。隐藏實作(即封裝它們)有助于松耦合。

1即不可見了。——譯者注

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。