斷斷續續看了些設計原則的文章,通過寫下來加深下個人的記憶和理解~理解不一定很透徹,歡迎指正~
學習的部落格:
個人感覺這些設計原則都是類似的,目的都是實現松耦合 強內聚 少修改 多擴充套件的**。遵循面向抽象或面向介面程式設計的原則。
1、黎克特制替換:子類能夠完全替換父類,程式功能不受影響。-說白了就是在呼叫父類的地方可以用子類進行替換,那就必須要求父類中不能擁有私有內容,私有的內容子類是無法繼承的,因此滿足黎克特制替換原則就必須要求父類所有的字段 方法 屬性等必須是非私有的,否則就不是安全的。
實際問題和解決方法:如果子類重寫了父類的方法,那麼子類雖然能替換父類,但是兩者的行為已經不同了,就不能滿足黎克特制替換,改變了程式功能。因此可以用介面和抽象類做父類,不提供具體的實現,將細節的實現放在子類中。這樣就滿足黎克特制替換原則了。這裡面牽扯繼承的本質,如果理解了那個,這個就很好理解。
2、單一職責原則:就是某乙個類最好只有乙個能引起變化的項。乙個類不要具有過多的行為,實際情況中就是,寫**將乙個頁面的行為都放在乙個類中,為了滿足單一職責,可以將這些行為,分一下類,通過不同的類實現不同的介面來呼叫,能減少後期維護的工作量。
3、依賴倒置原則:高層不依賴底層,兩者應該依賴抽象(介面或抽象類);抽象不依賴細節,細節應該依賴抽象。
理解:為了實現松耦合,減少物件間的依賴,專案達到少修改原有的,多擴充套件的原則。比如客戶端呼叫具有某一行為的類a,如果a改變了,客戶端也需要修改,改為客戶端呼叫某一介面或抽象類,a實現該介面或繼承改抽象類,就能減少客戶端對a的依賴,改為依賴介面或抽象類了。通過控制反轉實現依賴倒置,依賴注入可以實現控制的反轉。
這個是大神的文章:
這是乙個依賴注入的例子:
個人理解:比如a需要呼叫b,a依賴b,一般情況下的做法是在a中直接new乙個b,這樣a會對b產生依賴,耦合高,如果後期需要更改b,a也需要變動。遵循依賴倒置的原則的話,a應該依賴於乙個b繼承的抽象類c或實現的介面d,b去實現介面d或繼承抽象類c,那麼擴充套件的時候只需要將新新增的類e實現介面d或繼承抽象類c就可以,那麼a將不再依賴於b,但是a和底層還是耦合過高,因為在a中必須new乙個c或者通過工廠模式等返回乙個實現d的類,想要實現完全的依賴倒置,那就要通過控制反轉,a不再主動獲取b,而是等待b的例項,先要實現控制反轉,那麼就需要通過依賴注入的方式,需要乙個外部容器ioc,在容器中對b進行獲取和例項化,然後再通過構造注入 屬性注入 方法注入等方式(a獲取的引數型別就是c或d,依賴抽象,不依賴細節,這個地方牽扯到黎克特制替換原則,注入的b是否能夠完全替換c,介面的話就不用考慮這個),將b注入到a,那麼就實現了控制反轉,也就符合了依賴倒置的原則。
依賴倒置是原則,控制反轉是思想,依賴注入是設計模式或方法。最根本的目的都是減少物件間的依賴,進行解耦。
4、開放封閉原則:就是對專案實現少修改原有的,易擴充套件的目的。維護專案時,如果要新增新功能等,最好通過新增新的類來實現,而不是修改原有的類。
實現方法:讓類依賴於抽象或介面,而不是具體的類,就會減少修改,這就是封閉的原則;通過物件導向程式設計的繼承和多型,來實現行為的多樣化,擴充套件行為,這就是開放原則。
5、介面隔離原則:感覺和單一職責原則是乙個意思,只不過這個對介面實現單一職責原則,要求介面的行為具有統一性或一致性,使用多個小的專門的介面,不要使用籠統的乙個打介面。如果介面的行為過多,那麼實現它的類就必須實現所有的方法,可能一些行為是類不需要的。
個人學習總結一物件導向1
物件導向1 一 物件導向與面向過程的區別 面向過程 先設計一組函式用來解決乙個問題,然後在去確定函式中相應的需要處理的資料的儲存位置,即 演算法 資料結構 程式 先決定演算法,再去決定使用的資料結構 物件導向 先確定要處理的資料,然後再設計處理資料的演算法,最後將資料和演算法封裝在一起構成物件。二 ...
持有物件(個人學習總結)
1.list arraylist與linkedlist區別 前者在隨機訪問元素方面有優勢,後者可以通過較低的代價進行插入與刪除。2.iterator迭代器iteratorit pets.inerator while it.hasnext 迭代器只能單向移動,迭代器統一了對容器的訪問 listiter...
個人學習總結
組 groupadd 建立新群組 groudel 刪除組groudmod 修改組的資訊 cat etc group 檢視組的資訊 使用者 group 換成user cat etc passwd 檢視使用者的資訊 ps 顯示當前程序資訊 常用引數 e 和 aux kill 結束程序 常用引數 9 ki...