面向對象設計原則之開閉原則

開閉原則是面向對象的可復用設計的第一塊基石焰枢,它是最重要的面向對象設計原則。開閉原則由Bertrand Meyer于1988年提出戈抄,其定義如下:

開閉原則(Open-Closed Principle, OCP):一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展茶袒。

在開閉原則的定義中,軟件實體可以指一個軟件模塊凉馆、一個由多個類組成的局部結構或一個獨立的類薪寓。

任何軟件都需要面臨一個很重要的問題,即它們的需求會隨時間的推移而發(fā)生變化澜共。當軟件系統(tǒng)需要面對新的需求時预愤,我們應該盡量保證系統(tǒng)的設計框架是穩(wěn)定的。如果一個軟件設計符合開閉原則咳胃,那么可以非常方便地對系統(tǒng)進行擴展植康,而且在擴展時無須修改現(xiàn)有代碼,使得軟件系統(tǒng)在擁有適應性和靈活性的同時具備較好的穩(wěn)定性和延續(xù)性展懈。隨著軟件規(guī)模越來越大销睁,軟件壽命越來越長,軟件維護成本越來越高存崖,設計滿足開閉原則的軟件系統(tǒng)也變得越來越重要冻记。

為了滿足開閉原則,需要對系統(tǒng)進行抽象化設計来惧,抽象化是開閉原則的關鍵冗栗。在Java、C#等編程語言中供搀,可以為系統(tǒng)定義一個相對穩(wěn)定的抽象層隅居,而將不同的實現(xiàn)行為移至具體的實現(xiàn)層中完成。在很多面向對象編程語言中都提供了接口葛虐、抽象類等機制胎源,可以通過它們定義系統(tǒng)的抽象層,再通過具體類來進行擴展屿脐。如果需要修改系統(tǒng)的行為涕蚤,無須對抽象層進行任何改動宪卿,只需要增加新的具體類來實現(xiàn)新的業(yè)務功能即可,實現(xiàn)在不修改已有代碼的基礎上擴展系統(tǒng)的功能万栅,達到開閉原則的要求佑钾。

Sunny軟件公司開發(fā)的CRM系統(tǒng)可以顯示各種類型的圖表,如餅狀圖和柱狀圖等烦粒,為了支持多種圖表顯示方式次绘,原始設計方案如圖1所示:

圖1 初始設計方案結構圖.png

在ChartDisplay類的display()方法中存在如下代碼片段:

......if (type.equals("pie")) 
{PieChart chart = new PieChart();
chart.display();}
else if (type.equals("bar")) {
BarChart chart = new BarChart();chart.display();
}
......

在該代碼中,如果需要增加一個新的圖表類撒遣,如折線圖LineChart邮偎,則需要修改ChartDisplay類的display()方法的源代碼,增加新的判斷邏輯义黎,違反了開閉原則禾进。
現(xiàn)對該系統(tǒng)進行重構,使之符合開閉原則廉涕。

在本實例中泻云,由于在ChartDisplay類的display()方法中針對每一個圖表類編程,因此增加新的圖表類不得不修改源代碼狐蜕〕璐浚可以通過抽象化的方式對系統(tǒng)進行重構,使之增加新的圖表類時無須修改源代碼层释,滿足開閉原則婆瓜。具體做法如下:

  • (1) 增加一個抽象圖表類AbstractChart,將各種具體圖表類作為其子類贡羔;

  • (2) ChartDisplay類針對抽象圖表類進行編程廉白,由客戶端來決定使用哪種具體圖表。

重構后結構如圖2所示:

圖2 重構后的結構圖.png

在圖2中乖寒,我們引入了抽象圖表類AbstractChart猴蹂,且ChartDisplay針對抽象圖表類進行編程,并通過setChart()方法由客戶端來設置實例化的具體圖表對象楣嘁,在ChartDisplay的display()方法中調(diào)用chart對象的display()方法顯示圖表磅轻。如果需要增加一種新的圖表,如折線圖LineChart逐虚,只需要將LineChart也作為AbstractChart的子類聋溜,在客戶端向ChartDisplay中注入一個LineChart對象即可,無須修改現(xiàn)有類庫的源代碼痊班。

注意:因為xml和properties等格式的配置文件是純文本文件勤婚,可以直接通過VI編輯器或記事本進行編輯摹量,且無須編譯涤伐,因此在軟件開發(fā)中馒胆,一般不把對配置文件的修改認為是對系統(tǒng)源代碼的修改。如果一個系統(tǒng)在擴展時只涉及到修改配置文件凝果,而原有的Java代碼或C#代碼沒有做任何修改祝迂,該系統(tǒng)即可認為是一個符合開閉原則的系統(tǒng)。

文章轉載自 —— 面向對象設計原則之開閉原則

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末器净,一起剝皮案震驚了整個濱河市型雳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌山害,老刑警劉巖纠俭,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浪慌,居然都是意外死亡冤荆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門权纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓简,“玉大人,你說我怎么就攤上這事汹想⊥獾耍” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵古掏,是天一觀的道長损话。 經(jīng)常有香客問我,道長槽唾,這世上最難降的妖魔是什么席镀? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮夏漱,結果婚禮上豪诲,老公的妹妹穿的比我還像新娘。我一直安慰自己挂绰,他們只是感情好屎篱,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葵蒂,像睡著了一般交播。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上践付,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天秦士,我揣著相機與錄音,去河邊找鬼永高。 笑死隧土,一個胖子當著我的面吹牛提针,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曹傀,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辐脖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了皆愉?” 一聲冷哼從身側響起嗜价,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幕庐,沒想到半個月后久锥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡异剥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年奴拦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片届吁。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡错妖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疚沐,到底是詐尸還是另有隱情暂氯,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布亮蛔,位于F島的核電站痴施,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏究流。R本人自食惡果不足惜辣吃,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芬探。 院中可真熱鬧神得,春花似錦、人聲如沸偷仿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酝静。三九已至节榜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間别智,已是汗流浹背宗苍。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讳窟。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓让歼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挪钓。 傳聞我的和親對象是個殘疾皇子是越,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351