閱讀筆記十一——java開閉原則

一,抽象類
1.1,什麼是抽象類?
抽象類每每用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不一樣,可是本質上相同的具體概念的抽象。好比,在一個圖形編輯軟件的分析設計過程當中,就會發現問題領域存在着圓、三角形這樣一些具體概念,它們是不一樣的,可是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域並非直接存在的,它就是一個抽象概念。而正是由於抽象的概念在問題領域沒有對應的具體概念,因此用以表徵抽象概念的抽象類是不可以實例化的。函數

1.2,爲何要使用抽象類?
在面向對象程序設計中,抽象類主要用來進行類型隱藏。構造出一個固定的一組行爲的抽象描述,可是這組行爲卻可以有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現爲全部可能的派生類。模塊能夠操做一個抽象體。因爲模塊依賴於一個固定的抽象體,所以它能夠是不容許修改的;同時,經過從這個抽象體派生,也可擴展此模塊的行爲功能。爲了可以實現面向對象設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。設計

二,開閉原則
2.1,什麼是開閉原則?
開閉原則(OCP)是面向對象設計中「可複用設計」的基石,是面向對象設計中最重要的原則之一,其它不少的設計原則都是實現開閉原則的一種手段。開閉原則是說軟件實體(類、模塊、函數等)應該能夠擴展,可是不能夠修改。開閉原則的意思就是說,在設計軟件的時間要時刻考慮,儘可能讓這個類是足夠好的,寫好了就不要去修改,若是新需求來,經過增長類來實現新需求的功能,原來的代碼能不動就不動。也就是說,面對新需求,對程序的改動是經過增長新代碼進行的,而不是更改現有的代碼,這就是開閉原則的精髓所在。對象

2.2,開閉原則設計出的模塊具備兩個主要特徵
對於擴展是開放的(Open for extension): 這意味着模塊的行爲是能夠擴展的。當應用的需求改變時,能夠對模塊進行擴展,使其具備新的功能知足需求的變化。
對於修改是關閉的(Closed for modification): 對模塊進行擴展時,沒必要改動模塊原有的代碼或者二進制代碼。模塊的二進制可執行版本,不管是可連接的庫、DLL或者.EXE文件,都無需改動。
2.3,什麼時候應對變化?
不管模塊是多麼的封閉,都會存在一些沒法對之封閉的變化。既然不能徹底封閉,設計人員必須對於他設計的模塊應該對哪些變化封閉做出選擇。必須先猜想出最有可能發生變化的種類,而後構建抽象來隔離那些變化。
事先猜想全部的變化,很是難作到也不現實,能夠在最初設計軟件時,假設變化不會發生,等到變化發生時,馬上採起行動建立抽象來隔離之後發生的同類變化。例如:以前作的計算器程序,剛開始只能進行加減運算,此時若是要增長乘除運算就要修改原來的類,違背了開閉原則,爲了應對這個變化,就該考慮重構程序,增長一個抽象的運算符類,經過一些面向對象的手段來隔離之後發生的同類變化。
並非何時應對變化都是很容易的,在開發的過程當中應儘量早的知道可能發生的變化。查明可能發生的變化的時間越久,要建立正確的抽象就越困難。例如:以前作的計算器程序,若是加減法在不少地方都用到了,再考慮抽象、考慮分離就很困難。
2.4,實現方法
實現開閉原則的關鍵就在於「抽象」。把系統的全部可能的行爲抽象成一個抽象底層,這個抽象底層規定出全部的具體實現必須提供的方法的特徵。做爲系統設計的抽象層,要預見全部可能的擴展,從而使得在任何擴展狀況下,系統的抽象底層不需修改;同時,因爲能夠從抽象底層導出一個或多個新的具體實現,能夠改變系統的行爲,所以系統設計對擴展是開放的。在實際開發過程的設計開始階段,就要羅列出來系統全部可能的行爲,並把這些行爲加入到抽象底層,根本就是不可能的,這麼去作也是不經濟的。所以應該現實的接受修改擁抱變化,使編寫的代碼能夠對擴展開放,對修改關閉。

ip

相關文章
相關標籤/搜索