單一職責原則:single responsibility principle
開閉原則 :open closed principle
黎克特制替換原則:liskov substitution principle
介面隔離原則:inte***ce segregation principle
依賴倒置原則:dependence inversion principle
「乙個類只能由乙個原因使其改變」 。
或者說,乙個類只實行乙個職責,如果有多種變化原因導致乙個類要被修改,那麼這個類,就違反了單一職責原則。其中的「多種原因」可能是可能是這個類的所實現的某個需求發生了變化。
「乙個類應該對擴充套件開放,對修改關閉」。
假如windows系統是乙個不遵守ocp原則的模組,那麼在我們使用了多年的win7之後,假如我們更新到win10,由於對win7擴充套件成win10的時候,對win7的內容進行了較多的修改,導致我們公升級到win10之後,win7的原有功能都被修改了,這就會使我們很困惑。明明只是公升級,結果就好像用了乙個新系統一樣。而實際上,從win7到win10,我認為盡可能地做到了「對擴充套件開放,對修改關閉」,這樣就會讓使用者在享受新版本特性的同時也能繼續保持自己以往的使用習慣,使使用者更輕鬆。但是,我也認為由於我們無法**未來我們將要做如何種類的擴充套件,所以我們或許永遠也無法完全做到開閉原則,或許我們能做的,就是以srp原則為基礎,運用介面,抽象類,或者其他的設計模式來盡可能降低模組與模組之間的耦合性,盡可能向偉大的ocp原則靠攏。
「子類物件可以替換其父類物件被使用」 。
簡單地說,就是父類能出現的地方子類就可以出現,且不會出現異常。假如 dog 是animal 的子類 那麼我們可以說 dog dog = new dog();根據lsp原則,我們也可以說 animal dog = new dog(); 即狗是動物。不過我們不能反過來說 dog dog = new animal(), 這顯然是離譜的,而且編譯器會報錯。如果我們的設計滿足了lsp原則,那麼子類就可以完全替換父類並進行擴充套件,促進「對擴充套件開放,對修改關閉」的ocp原則的實現。
「客戶端不應該被迫依賴於它不需要的介面,類與類之間的依賴關係應該建立在最小的介面上」。
也就是說,我們要盡量建立乙個「苗條」的介面,而不是乙個裡面包含多種方法集合的臃腫介面;盡量要減少客戶端對不需要介面的依賴。假如現在有兩種人,一種是熱衷於電子競技從不敲**的的遊戲玩家,一種是從來不打遊戲的程式設計學習者。而膝上型電腦又有兩種,一種是搭載了高配置顯示卡可以暢玩3a大作,一種是搭載了低壓處理器能夠高續航的敲**。(以上均為假設)
//膝上型電腦介面
inte***ce
laptopinte***ce
//膝上型電腦實現類
class
laptop
implements
laptopinte***ce
@override
public
void
code()
}//從不打**的電子競技玩家
class
player
}//測試類
public
class
test
}
可以看出,這樣的設計是違反了介面隔離原則的,電子競技玩家被迫依賴了自己不需要的打**方法。將來對電腦介面的code()方法進行修改的時候都會影響到本來不需要code()方法的player例項。為了實現isp原則,我們應該將介面分解,使得需求不同的使用者去呼叫他們對應需求的介面。
//電子競技玩家介面
inte***ce
playaaagame
//程式設計學習者介面
inte***ce
inputcode
//膝上型電腦實現類
class
laptop
implements
playaaagame
,inputcode
@override
public
void
code()
}//從不打**的電子競技玩家
class
player
}//從不電競的程式設計學習者
class
coder
}//測試類
public
class
test
}
這樣就消除了player和coder對自己不需要介面的依賴。
我發現,介面隔離原則,本質上也是單一職責原則的一種體現.
「上層模組不應該依賴底層模組,他們都應該依賴於抽象。抽象不應該依賴於細節,細節應該依賴於抽象」。
從上面的例子我發現,使用者player和coder在使用電腦時也並沒有依賴膝上型電腦laptop的實體類,而是laptop實現的介面playaaagame和inputcode。當我們編寫好介面之後,即使laptop類出現了可以面向其他型別使用者的需求,我們只需要持有這一介面引用就可以進行操作了。我認為在設計的過程中遵循dip原則的同時,也是在默默的提醒我們要更好的實現isp原則,實現了介面隔離原則之後我們又可以正確的實現黎克特制替換原則,同時實現了上述原則,我認為才有可能盡可能的實現開閉原則。或許只有掌握了solid原則才能使我們寫出更加solid(可靠的)**吧。
C 筆記 物件導向的學習
c 物件導向的封裝 繼承 多型 一.封裝 封裝 把客觀的事物封裝成類,使用和修改方便 封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義在於保護或者防止 資料 被我們無意中破壞。封裝既可以封裝成員變數,又可以封裝成員方法 封裝學習例子 每個物件都...
物件導向學習筆記
新建乙個子類繼承父類時,會先找到父類的位址,在其之後增加子類的獨有元素。所有執行時先執行父類的建構函式,按照位址順序,執行子類的建構函式,層級越低,建構函式執行順序越靠後。這是子類的建構函式。這是父類的建構函式。這是執行結果。顯然程式是先執行了父類的建構函式,再執行子類的建構函式。在子類有如下屬性 ...
我眼中的物件導向
我眼中的物件導向 面向過程 物件導向 我要充話費 用支付寶 女朋友要充話費 給我打 我餓了 用美團外賣 女朋友餓了 給我打 引例動作 撰寫一篇部落格,發布部落格到 對於面向過程 撰寫 發布是兩個事件,形成函式並依次呼叫 對於物件導向 部落格可以抽象為一種文章,不關心具體實現 例項化 只關心這個抽象概...