編碼靈魂(6)-開閉原則

引言

我覺得編碼是有靈魂的,就像每個人都有信仰一樣。那麼如何去體現信仰,如何凸顯靈魂就需要依賴它所固有的原則。最近學習了設計模式的六大原則,有所感悟,特此做總結和記錄。本文中主要介紹了關於開閉原則的理解和定義,同時我們總結一下所有前面的五大原則對開閉原則的影響。筆者目前整理的一些blog針對面試都是超高頻出現的。大家可以點擊鏈接:http://blog.csdn.net/u012403290

開閉原則

以下是正式的解釋:

開閉原則(OCP)是面向對象設計中“可複用設計”的基石,是面向對象設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。對於擴展是開放的,對於修改是關閉的

從中可以看出,開閉原則的核心是“可複用”,它具有兩大特徵:①對於拓展是開放的;②對於修改是關閉的。舉個例子,比如說HashMap是實現了Map接口的,那麼如果需要拓展功能,那麼就修改HashMap而不用去修改Map接口,同時Map是禁止修改的(因爲修改接口,會強制要求所有實現要做相應修改,牽一髮而動全身)。那麼前者就是開放的,後者就是關閉的。再延伸一點,其實抽象是非常靈活的,而具體的實現是非常豐富的,我們在設計的時候,儘量不去修改抽象,而是要去修改具體實現。用別人總結的話就是:“用抽象構建框架,用實現擴展細節”。

設計模式總綱領

對於設計模式的幾天研究,我總結了各個原則的關係,並表現在了圖中,或許有些人看來和你想的不太一樣,請不要介意。概念化的東西一千個人會有一千種思想的
這裏寫圖片描述
這個是博主自己總結的,個人覺得設計模式主要實現的是開閉原則,而所有下層原則所追求的就是開閉原則。接下來,我們一一對其解釋:

1、里氏替換原則:我給它命名叫亙古不變。意思就是在繼承的過程中,要保證不破壞父類的功能,子類可以自由的擴展自己的功能。它主要針對繼承關係中,體現在具體實現中(如果父類是抽象的,就無所謂破壞了)。所以它是遵循開閉原則的,父類不可變動,子類可自由拓展,不破壞繼承的關係。

2、迪米特原則:我給它命名叫獨身自好。意思就是不要去管別人,管好自己就好。主要體現在兩個方面:①只和自己的朋友說話,不和陌生人說話;②增加自己類的內聚性;所以命名獨身自好,博主覺得挺好的。它主要針對的是類與類之間的關係,同時它體現在具體實現中。所以它也是遵循開閉原則的,高內聚,低耦合。

3、單一職責原則:我給它命名恪盡職守。意思就是類認真做好自己分內的事。它主要針對的是類與類的關係,體現在具體的實現中。恪盡職守的好處是,每個類都獨立的,更好的完成自己分內的事,所以它也是遵循開閉原則的,它使得類與類之間的耦合性會很低。

4、依賴倒置原則:我給它命名主次分明。意思就是在涉及層次的時候,不要被表面的依賴誤導了,要以抽象爲主,具體實現要依賴抽象。主要是要求要面向接口編程,也就是要面向抽象編程。它主要是針對接口和抽象類,主要體現在抽象中。所以它也遵循開閉原則的,以抽象爲架構,用實現來完善細節。

5、接口隔離原則:我給它命名量身定做。意思就是當一個類去實現接口的時候,接口中這些方法是恰恰好給這個類的,對於這個類來說這個接口是給它量身定做的。它主要針對接口和抽象類,主要體現在抽象中。所以它也是遵循開閉原則的,它使得模塊之間耦合性更低,層次更清晰。

過猶不及

在前面的文章中,我也多次提及“墨守成規”的問題,設計模式六大原則,如果每一步都嚴格遵循會產生很多問題(比如說迪米特原則,那麼它會產生很多友元類)。所以在設計過程中,如何掌握原則的度量需要對實際情況進行分析。比較兩者代價與開銷,選擇更恰當的實現方式,不然過猶不及會讓你有一種無力感。

下圖是我對設計模式原則遵循程度和項目優雅性畫的一張圖(僅個人想法):
這裏寫圖片描述

後記

好了,設計模式六大原則到這裏也算是完美結束了。後面可能要繼續寫一些面試中的核心問題,目前整理了很多面試題目,我會挑一些好的,寫成博文和大家一起探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章