在15年的年底,準備認認真真的學習一下相關的設計模式,今天是第一天。參考的書籍——《Android源碼設計模式解析與實踐》,特寫博客,算作學習筆記吧!!
單一職責原則(Single Responsibility Principle)
兩個完全不一致的功能實現就不應該放在同一個類中,一個類中應該是一組相關性很高的函數、數據的封裝。但是這個的界限往往不是那么清晰,很多時候都是憑借自己的經驗來劃分類與類之間的界限。這個也是單一原則頗受爭議的地方。因為每個人的思維方式、經驗各不相同,那么劃分類的職責界限必定各不相同!
開閉原則(Open Close Principle)
軟件中的對象(類、模塊、函數等)應該對于擴展是開放的,但是對于修改是封閉的。這個就是要求我們應該使用擴展的方式來實現變化,而不是應該寫死對象與對象的聯系。更不應該頻繁的修改應經寫好的代碼。
里氏替換原則(Liskov Substitution Principle)
里氏替換原則就是對于上面開閉原則提供的具體實現的原則,那就是面向接口、抽象編程。也就是面向對象中,繼承和多態的體現。我們通過建立抽象建立相應的規范,而具體的實現實在運行時替換相關的抽象,而建立具體的實現。所以抽象和接口是面向對象編程的精髓所在啊!!
依賴倒置原則(DependenceInversion Principle)
1.高層模塊不應該依賴底層模塊。兩者都應該依賴其抽象。
2.抽象不應該依賴細節(具體實現)。
3.細節應該依賴抽象。
其實就是說模塊間依賴是通過抽象發生。實現類之間不發生直接的依賴關系,其依賴關系是通過接口或者抽象類來產生的。其實還是上面里氏替換原則里面強調的問題——面向接口、抽象編程。
接口隔離原則(InterfaceSegregation Principle)
類間的依賴關系應該建立在最小的接口上。其實還是一個依賴抽象的道理,那就是不管具體實現的子類擁有了很多其他特性,但是基本的還是可以通過父類或者接口來確定(有點兒向上轉型的調調),當我們不需要或者不關心子類特有的方法屬性時,那就把它作為接口或者父類去使用。而在當做接口使用時,又可以不用擔心其他特有的方法被暴露出去,在Android的AIDL中就是返回的一個接口,通過這個接口,可以只暴露出需要暴露的方法,而其他特有的方法調用者將無法得知。
迪米特原則(Law of Demeter)
一個對象應該對其他對象有最小的了解。類的內部實現應該與調用者或者依賴者沒有半毛錢的關系。封裝性的體現吧。如果類與類之間的關聯性越高,那也就意味著耦合性也高,一個類發生變化必定會影響到它的關聯類。迪米特原則旨在劃分好類與類關聯是互相的職責關系,對外只暴露接口或者方法,隱藏其內部的具體實現。
以上需要明白在構建對象和相關項目時,應當確定每一個對象、方法、接口的功能,首先盡量做到功能單一原則,在這個基礎上,應該再明確模塊與模塊直接的關系,這里就需要遵循開閉原則和里氏替換原則,還有依賴倒置原則,所到底就是明確哪些是最基本的方法,哪些是需要子類具體去實現的方法。需要具體實現就通過抽象(抽象方法和接口)讓子類去具體實現。而模塊與模塊之間,具體實現對象之間,也應當做到抽象不依賴細節,它們之間也通過接口作為橋梁來降低耦合!最后在類與類交互的時候,應該明確好自己的功能,只對外暴露調用者需要的方法,而自己的內部具體實現應該隱藏起來。