👑單一職責原則
????????單一職責原則告訴我們一個類應該只有一個責任或者只負責一件事情。
????????想象一下,如果一個類承擔了太多的責任,就像一個人同時負責做飯、洗衣服和打掃衛生一樣,那么這個類會變得非常復雜,難以理解和維護。而且,當需要修改其中一個功能時,可能會影響到其他功能,導致意想不到的問題。
????????通過遵循單一職責原則,我們可以將一個復雜的類拆分成多個小的、具有獨立職責的類。每個類只關注自己的職責,這樣代碼會更加清晰、易于理解和修改。
????????舉個例子,假設我們有一個User類,它既負責用戶的登錄驗證,又負責用戶信息的管理。按照單一職責原則,我們可以將這個類拆分成兩個類:一個負責用戶的登錄驗證,另一個負責用戶信息的管理。這樣,當我們需要修改登錄驗證邏輯時,就不會影響到用戶信息的管理部分。
????????總結起來,單一職責原則的核心思想是:一個類應該只有一個責任,這樣可以提高代碼的可讀性、可維護性和可擴展性。
👑里氏替換原則
????????里氏替換原則指導我們如何設計和使用繼承關系。簡單來說,里氏替換原則告訴我們,子類對象可以替換父類對象出現在任何能使用父類對象的地方,而不會產生錯誤或者破壞程序的正確性。
????????舉個例子,假設有一個動物類Animal,其中有一個方法叫做makeSound(),用于發出動物的聲音。然后我們派生出了兩個子類Cat和Dog,它們都繼承自Animal類。按照里氏替換原則,我們可以在任何需要Animal對象的地方使用Cat或Dog對象,比如調用makeSound()方法。
????????具體到代碼實現上,如果Cat和Dog類分別實現了自己的makeSound()方法,那么無論是Animal類型的變量還是Cat、Dog類型的變量,都可以調用makeSound()方法,而且得到的結果應該符合預期。
????????總結起來,里氏替換原則的核心思想是:子類對象應該能夠替換父類對象,而不會引起任何錯誤或異常。這樣設計出來的代碼更加靈活、可擴展,并且易于維護。
👑開閉原則
????????開閉原則告訴我們軟件實體(類、模塊、函數等)應該對擴展開放,對修改關閉。
????????開閉原則的核心思想是:當需要改變一個系統的行為時,我們應該盡量通過添加新的代碼來實現,而不是修改已有的代碼。這樣做的好處是,我們可以保持已有的代碼穩定性,減少引入新錯誤的風險。
????????舉個例子,假設我們有一個電商網站,其中有一個購物車類Cart,用于管理用戶的購物車信息。現在,我們需要添加一個新的功能,比如優惠券折扣。按照開閉原則,我們應該創建一個新的類DiscountCoupon,并且讓它負責計算折扣金額。然后,在Cart類中,我們可以通過調用DiscountCoupon類的方法來獲取折扣金額,而不是直接修改Cart類的代碼。
????????這樣做的好處是,如果以后我們需要添加其他類型的折扣,比如滿減或者贈品,我們只需要創建相應的類,并且確保它們都符合同一個抽象接口。這樣,我們可以輕松地擴展系統的功能,而不需要修改已有的代碼。
????????總結起來,開閉原則的目標是讓我們能夠通過擴展來改變一個系統的行為,而不需要修改已有的代碼。這樣可以提高代碼的穩定性、可維護性和可擴展性。
👑依賴倒轉原則
????????依賴倒轉原則告訴我們高層模塊不應該依賴于低層模塊,而是應該依賴于抽象。
????????通俗地說,依賴倒轉原則就是要求我們在設計代碼時,盡量使用抽象類或者接口來進行編程,而不是直接依賴具體的實現類。這樣做的好處是,可以降低模塊之間的耦合度,提高代碼的靈活性和可維護性。
????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照依賴倒轉原則,我們應該定義一個抽象的Payment接口,然后讓Order類依賴于這個接口。具體的支付方式,比如支付寶、微信支付等,都應該實現這個接口,并且提供自己的具體實現。
????????這樣做的好處是,當我們需要更換支付方式時,比如從支付寶切換到微信支付,我們只需要創建一個新的實現類,并且修改配置文件或者注入相應的實例即可,而不需要修改Order類的代碼。這樣,我們可以輕松地擴展和變更系統的功能,而不會對其他模塊產生影響。
????????總結起來,依賴倒轉原則的核心思想是:高層模塊不應該依賴于低層模塊,而是應該依賴于抽象。通過使用抽象類或者接口來編程,可以降低模塊之間的耦合度,提高代碼的靈活性和可維護性。
👑接口隔離原則
????????接口隔離原則告訴我們客戶端不應該依賴于它不需要的接口。
????????通俗地說,接口隔離原則就是要求我們將龐大而臃腫的接口拆分成更小、更具體的接口,以滿足客戶端的精確需求。這樣做的好處是,可以降低客戶端與接口之間的耦合度,提高代碼的靈活性和可維護性。
????????舉個例子,假設我們有一個電商網站,其中有一個Product類用于處理商品相關的邏輯。按照接口隔離原則,我們應該將Product類的接口拆分成多個更小的接口,比如IProductInfo和IProductReview。這樣,客戶端只需要依賴于它們所需的接口,而不需要依賴整個Product類的接口。
????????這樣做的好處是,當我們需要在客戶端中使用商品信息時,只需要實現IProductInfo接口即可,而不需要關心其他不需要的方法。同樣,當我們需要在客戶端中使用商品評價時,只需要實現IProductReview接口即可。
????????通過接口隔離原則,我們可以避免客戶端依賴于不需要的接口,減少了對無用方法的依賴,提高了代碼的可讀性和可維護性。同時,接口隔離原則也促進了代碼的復用,因為我們可以根據需要選擇實現不同的接口。
總結起來,接口隔離原則的核心思想是:客戶端不應該依賴于它不需要的接口。通過拆分龐大的接口,只提供客戶端所需的精確接口,可以降低耦合度,提高代碼的靈活性和可維護性。
👑迪米特法則
????????迪米特法則,也被稱為最少知識原則,它告訴我們一個對象應該盡量減少與其他對象之間的交互,只與直接的朋友進行通信。
????????通俗地說,迪米特法則就是要求我們在設計代碼時,盡量降低對象之間的耦合度,避免一個對象過多地了解其他對象的內部細節。這樣做的好處是,可以提高代碼的可維護性和靈活性,減少對其他對象的依賴。
????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照迪米特法則,我們應該盡量減少Order類與其他類的直接交互,只與必要的對象進行通信,比如與Product類、Payment類等直接相關的對象。
????????這樣做的好處是,當需要修改或者擴展系統的某個功能時,我們只需要關注與之直接相關的對象,而不需要考慮其他無關的對象。這樣可以降低代碼的復雜度,提高代碼的可讀性和可維護性。
????????另外,迪米特法則還鼓勵使用中間對象來協調其他對象之間的交互,以減少對象之間的直接依賴關系。這樣可以提高系統的靈活性,降低耦合度。
????????總結起來,迪米特法則的核心思想是:一個對象應該盡量減少與其他對象之間的交互,只與直接的朋友進行通信。通過降低對象之間的耦合度,可以提高代碼的可維護性和靈活性,減少對其他對象的依賴。
👑合成復用原則
????????合成復用原則告訴我們在設計代碼時,應該優先使用組合(composition)而不是繼承(inheritance)來實現復用。
????????通俗地說,合成復用原則就是要求我們通過將已有的類組合起來,構建新的類來實現復用,而不是通過繼承已有的類。這樣做的好處是,可以減少類之間的耦合度,提高代碼的靈活性和可維護性。
????????舉個例子,假設我們有一個電商網站,其中有一個Order類用于處理訂單相關的邏輯。按照合成復用原則,我們應該優先使用組合來實現訂單的功能,而不是通過繼承已有的類。
????????具體來說,我們可以定義一個Order類,然后在該類中使用其他已有的類,比如Product類和Payment類,作為其成員變量。這樣,Order類就可以通過調用這些成員變量的方法來實現自己的功能,而不需要繼承這些類。
????????這樣做的好處是,當我們需要修改或者擴展系統的某個功能時,只需要關注與之相關的類,而不需要影響到其他類。同時,由于使用了組合而不是繼承,我們可以更加靈活地選擇和替換成員變量,以滿足不同的需求。
總結起來,合成復用原則的核心思想是:優先使用組合而不是繼承來實現復用。通過將已有的類組合起來構建新的類,可以降低耦合度,提高代碼的靈活性和可維護性。