面向對象的設計原則是OOP編程的核心,但我已經看到大多數Java程序員追逐設計模式,如Singleton模式,Decorator模式或Observer模式,並無充分注意學習面向對象的分析和設計。學習面向對象編程(如抽象,封裝,多態和繼承)的基礎知識很是重要。可是,瞭解面向對象的設計原則一樣重要。它們將幫助您建立一個乾淨的模塊化設計,以便未來輕鬆測試,調試和維護。程序員
我常常看到各類經驗水平的Java程序員和開發人員,他們從未據說過這些OOP和SOLID設計原理,或者根本不知道特定設計原則提供什麼好處以及如何在編碼中應用這些設計原則。面試
盡我所能,我已經記下了全部重要的面向對象設計原則並將其放在這裏以供快速參考。這些至少可讓你瞭解它們是什麼以及它們提供的好處。編程
1. DRY (Don't repeat yourself)設計模式
咱們的第一個面向對象的設計原則是DRY,顧名思義DRY(不要重複本身)意味着不要編寫重複的代碼,而是使用Abstraction在一個地方抽象常見的東西。若是你在兩個以上的地方有一個代碼塊,請考慮將其做爲一個單獨的方法,或者若是你使用屢次硬編碼值使它們公開最終常量。架構
這種面向對象設計原則的好處在於維護。重要的是不要濫用它,重複不是代碼,而是功能。這意味着若是你使用公共代碼來驗證OrderID和SSN,那麼這並不意味着它們是相同的,或者它們未來會保持不變。框架
經過使用兩個不一樣功能或事物的公共代碼,你能夠永久地將它們緊密耦合,當你的OrderId更改其格式時,您的SSN驗證代碼將會中斷。模塊化
因此要注意這種耦合,只是不要組合使用相似代碼但不相關的任何東西。你能夠在Udemy上進一步查看Java課程中的軟件架構和設計模式基礎知識,以瞭解有關編寫設計系統時要遵循的良好代碼和最佳實踐的更多信息。函數
2. 封裝有哪些變化學習
軟件領域中只有一件事是不變的,那就是「改變」,因此封裝你指望或懷疑將要改變的代碼。這種OOP設計原則的好處是能夠輕鬆測試和維護適當的封裝代碼。測試
若是你使用Java進行編碼,則遵循默認狀況下將變量和方法設爲私有的原則,並逐步增長訪問權限,例如:從私人到受保護而非公共。
Java中的一些設計模式使用Encapsulation,Factory設計模式是Encapsulation的一個示例,它封裝了對象建立代碼,並提供了之後引入新產品的靈活性,而不會影響現有代碼。
3.開放封閉設計原則
類方法或函數應該是Open for extension(新功能)和Closed以進行修改。這是另外一個漂亮的SOLID設計原則,它能夠防止有人更改已經試驗和測試過的代碼。
理想狀況下,若是隻是添加新功能,那麼應該測試該代碼,這是開放式封閉設計原則的目標。順便說一句,Open Closed原則是SOLID首字母縮略詞中的「O」。
4.單一責任原則(SRP)
單一責任原則是另外一種SOLID設計原則,在SOLID首字母縮略詞上表明「S」。根據SRP,類的更改緣由不該超過一個,或者類應始終處理單個功能。
若是在Java的一個類中放置了多個功能,它會引入兩個功能之間的耦合,即便更改了一個功能,也有可能破壞耦合功能,這須要進行另外一輪測試以免對生產環境產生任何意外。
5.依賴注入或反轉原理
這個設計原則的優勢在於任何由DI框架注入的類都易於使用模擬對象進行測試而且更易於維護,由於對象建立代碼集中在框架和客戶端代碼中沒有那麼多。
實現依賴注入有多種方法,好比使用像AspectJ那樣的一些AOP(Aspect Oriented programming)框架的字節碼檢測,或者使用像Spring同樣使用的代理。
6.同意組合而不是繼承
能夠的話,通常是優先選擇組合而不是繼承。有些人可能會爭論這一點,但我發現組合比繼承靈活得多。
複合容許在運行時經過在運行時設置屬性來更改類的行爲,並經過使用接口來組合類,咱們使用多態性,它提供了靈活性,能夠在任什麼時候候用更好的實現進行替換。
7.利斯科夫替代原則(LSP)
根據Liskov替換原則,子類型必須可替代超類型,即便用超類類型的方法或函數必須可以與子類的對象一塊兒工做而沒有任何問題「
LSL與單一責任原則和接口隔離原則密切相關。類具備比子類更多的功能可能不支持某些功能而且違反LSP。
8.接口隔離原理(ISP)
接口隔離原則指出,若是客戶端不使用接口,它就不該該實現接口。這種狀況一般發生在一個接口包含多個功能,而客戶端只須要一個功能而不須要其餘功能時。
界面設計是一項棘手的工做,由於一旦釋放界面,就沒法在不破壞全部實現的狀況下更改界面。
9.受權原則
Java中這種設計原則的另外一個好處是,接口的缺點是在任何類均可以使用以前實現全部方法,所以具備單一功能意味着實現的方法更少。
不要本身作全部的事情,把它委託給不一樣的類。委託設計原則的經典例子是Java中的equals()和hashCode()方法。爲了比較兩個對象是否相等,咱們要求類自己進行比較,而不是客戶端類進行檢查。
這種設計原則的主要好處是沒有代碼的重複,而且很容易修改行爲。事件委託是此原則的另外一個示例,其中將事件委託給處理程序進行處理。
全部這些 面向對象的設計原則 經過努力實現高內聚和低耦合,幫助你編寫靈活且更好的代碼。理論是第一步,但最重要的是培養髮現什麼時候應用這些設計原則的能力。
獲取最新面試與學習資料,
歡迎加入Java進階架構交流羣:142019080。
直接點擊連接加羣。https://jq.qq.com/?_wv=1027&k=5lXBNZ7