二 :OCP(開閉原則)
Open-Close Principle
**********************************************************************************
表述:
1. 一個軟體實體應當對擴充套件開放 , 對修改封閉;
2. 對可變性的封閉原則;
3. 找到一個系統的可變因素,將它封閉起來;
也就是說在設計一個模組的時候,應當可以在不被修改的前提下被擴充套件。解決問題的關鍵就在於:抽象化!
那就是不允許更改系統的抽象層,而允許擴充套件系統的實現層。
我們讓模組依賴於一個固定的抽象體,這樣它就是不可以修改的;同時,通過這個抽象體派生,我們就可以擴充套件此模組的具體功能。這樣設計的程式只通過增加程式碼來變化而不是通過更改現有程式碼來變化,前面提到的修改的副作用就沒有了。
“開-閉”原則如果從另外一個角度講述,就是“找到一個系統的可變因素,將它封裝起來”,也即所謂的“對可變性的封裝原則”(Principle of Encapsulation of Variation, EVP)。
在我們考慮一個系統的時候,我們不要把關注的焦點放在什麼會導致設計發生變化上(具體),而是考慮允許什麼發生變化而不讓這一變化導致重新設計(抽象)。也就是說,我們的設計應支援變化。
總結:
1. 一個軟體系統的所有模組不可能都滿足OCP,但是我們應該努力最小化這些不滿足OCP的模組數量。
2. 開放-封閉法則是OO設計的真正核心。
3. 符合該法則便意味著最高等級的複用性(reusability)和可維護性(maintainability)。
策略模式舉例:商場打折,不同物品不同折扣,不同季節不同折扣
“對可變性的封裝原則”意味著兩點:
1. 一種可變性應當被封裝到一個物件裡面,而不應當散落到程式碼的很多角落裡。
同一種可變性的不同表象意味著同一個繼承等級結構中的具體子類。
繼承應當被看作是封裝變化的方法,而不應當是被認為從一般的物件生成特殊的物件的方法(繼承經常被濫用)。
2. 一種可變性不應當與另外一種可變性混合在一起。從具體的類圖來看,如果繼承結構超過了兩層,那麼就意味著將兩種不同的可變性混合在了一起。
“對可變性的封裝原則”從工程的角度說明了如何實現OCP。如果按照這個原則來設計,那麼系統就應當是遵守OCP的。但是現實的情況往往是紛繁複雜的,我們不可能100%的遵守OCP,但是我們要向這個目標來靠近。設計者要對設計的模組對何種變化進行封裝做出選擇。
相關文章
- OCP原則——開閉原則
- 設計原則:開閉原則(OCP)
- 小話設計模式原則之(4):開閉原則OCP設計模式
- 開閉原則OCP與KISS簡單原則衝突嗎? - macerubMac
- Observer觀察者模式與OCP開放-封閉原則Server模式
- 開閉原則
- 讓簡單工廠模式遵循開放封閉原則 (OCP)模式
- 設計模式筆記:開閉原則(OCP,The Open-Closed Principle)設計模式筆記
- 設計原則之【開放封閉原則】
- 面象物件設計6大原則之二:開放封閉原則物件
- 開閉原則——物件導向程式設計原則物件程式設計
- 物件導向設計原則之開閉原則物件
- DesignPattern系列__05開閉原則
- 物件導向之 開閉原則物件
- java開閉原則是什麼?Java
- 程式碼質量-開閉原則
- 設計模式六大原則(六)----開閉原則設計模式
- 設計模式六大原則(6):開閉原則設計模式
- 設計模式的七大原則(5) --開閉原則設計模式
- 七大軟體設計原則之一 | 開閉原則
- 嘻哈說:開放封閉原則
- 《JavaScript設計模式與開發實踐》原則篇(3)—— 開放-封閉原則JavaScript設計模式
- 開放封閉原則與規則引擎設計模式 - devgenius設計模式dev
- Laravel深入學習9 – 開放封閉原則Laravel
- 編碼最佳實踐——開放封閉原則
- 設計模式之開閉原則:對修改關閉,對擴充套件開放設計模式套件
- iOS 遵循開閉原則的實際案例討論iOS
- S.O.I.L.D 之開放封閉原則
- 借降本增效之名,探索開閉原則架構設計架構
- 開發原則。
- 開放封閉原則:打造更強大的軟體架構架構
- 請banq大哥SRP,OCP,LSP,DIP,ISP,LOD原則
- MySQL索引(二):建索引的原則MySql索引
- "數一數二"原則(轉載)
- 設計模式六大原則(二)----裡式替換原則設計模式
- 軟體設計中最關鍵的“開閉原則”,究竟指什麼呢?
- 3 分鐘吃透開閉原則,架構設計築基必知必會架構
- 遊戲陪玩系統開發,架構設計的開閉原則是如何實現的?遊戲架構