第4章 “開-閉”原則(Open-Closed Principle/OCP)
一個軟件實體應當對擴展開放,對修改關閉。
Software entities should be open for extension,but closed for modification.
這個原則說的是,在設計一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展。
滿足“開-閉”原則的設計可以給一個軟件系統兩個無可比擬的優越性:
l 通過擴展已有的軟件系統,可以提供新的行爲,以滿足對軟件的新需求,使變化中的軟件系統有一定的適應性和靈活性。
l 已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統有一定的穩定性和延續性。
里氏代換原則:任何基類可以出現的地方,子類一定可以出現。
依賴倒轉原則:要依賴於抽象,不要依賴於實現。
合成/聚合複用原則:要儘量使用合成/聚合,而不是繼承關係達到複用的目的。
迪米特法則:一個軟件實體應當與儘可能少的其他實體發生相互作用。
接口隔離原則:應當爲客戶端提供儘可能小的單獨的接口,而不要提供大的總接口。
策略模式:如果有一組算法,那麼就將每一個算法封裝起來,使得它們可以互換。
第5章 專題:JAVA語言的接口
在Java語言中,Java接口可以定義public的常量,可以有public、static、final的屬性。
在Java編譯器檢查方法的置換(Overrride)時,會進一步檢查兩個方法的返還類型和拋出的異常是否相同。
接口代表一個角色(role),實現這個接口的類便是扮演這個角色的演員。一個角色可以由不同的演員來演,而不同的演員之間除了扮演一個共同的角色之外,並不要求有任何其他的共同之處。
應當使用Java接口和抽象Java類而不是具體類進行變量的類型聲明、參量的類型聲明、方法的返還類型聲明,以及數據類型的轉換等。當然,一個更好的做法是僅僅使用Java接口,而不要使用抽象Java類來做到上面這些。
Java接口的常見用法:
單方法接口:一個單方法接口只含有一個方法。如:Runnable接口
標識接口:沒有任何方法和屬性的接口。如:java.io.Serializable、java.rmi.Remote
常量接口:用java接口來聲明一些常量,然後由實現這個接口的類使用這些常量。(這種方法是錯誤的)
第6章 專題:抽象類
具體類不是用來繼承的。只要有可能,不要從具體類繼承。
在一個以繼承關係形成的等級結構裏面,樹葉節點均應當是具體類,而樹枝節點均應當是抽象類(或者Java接口)。這樣的設計是所有的Java設計師都應當努力做到的。
在一個從抽象類到多個具體類的繼承關係中,共同的代碼應當儘量移動到抽象類裏,可以提高代碼的複用率。
抽象類應當擁有儘可能少的數據。
只有當以下的Coad條件全部被滿足時,才應當使用繼承關係:
(1) 子類是超類的一個特殊種類,而不是超類的一個角色,也就是要區分“Has-A”與“Is-A”兩種關係的不同。
(2) 永遠不會出現需要將子類換成另一個類的子類的情況。
(3) 子類具有擴展超類的責任,而不是具有置換掉(Override)或註銷掉(Nullify)超類的責任。
只有在分類學角度上有意義裏,纔可以使用繼承,不要從工具類繼承。