開放與封閉原則

開放與封閉原則(Open/Closed Principle,OCP):

               軟件實體應用允許擴展,但禁止修改。當應用需求改變時,可以對其模塊進行擴展,使其滿足需求變更的新行爲。但對模塊進行擴展時,不必改動該模塊的源代碼後二進制代碼。

 

擴展點:

        1、沒有擴展點的代碼:如果一個類沒有擴展點,那麼當這個類需要添加新需求時,需要修改這個類中的方法,這樣違背了封閉原則。爲了滿足新需求,需要創建一個新類來實現新需求的功能。

          2、虛方法:類中創建虛方法成員,這個虛方法就是一個擴展點。使用繼承技術使子類可以修改虛方法。使用多態可以不需要修改客戶端實現功能擴展。缺點:子類要麼在基類方法上添加新功能,要麼從新編寫新功能,不存在中間狀態(獲取基類代碼,在基類代碼上進行修改)。與繼承相同,子類對基類的私有成員不可見。

         3、抽象方法:創建抽象基類,基類中創建幾個抽象方法。子類繼承基類後實現抽象方法。各創建出的子類相互不影響,可以實現各自的功能。並且客戶端只需要依賴抽象基類,任何實現的子類都滿足要求。

         4、接口繼承:

                   基於實現繼承,所有子類(現有的和將來的)都是基類的客戶端,子類都是依賴基類實現的。因此所有對實現的改動都會是客戶端可能察覺到的改動。因此相對於繼承,通常會建議優先選擇組合,如果必須要使用繼承,也要儘量使用只有少量分層的淺繼承層次結構。(給繼承圖頂部節點添加新成員的改動會影響到該層次結構下的所有成員)

                   接口繼承可以根據不同的上下文給接口修飾豐富的功能(爲接口添加修飾器)。接口比類靈活,具有強大的自適應性能力。

 

防止變異(protected variation):識別可預見的變化點並圍繞他們創建一個穩定的接口。

             1、可預見的變化(predicted variation):單個類的需求應該直接與客戶端的一個業務需求關聯起來。衝刺過程中,開發人員可以提出預測將來潛在的相關需求,創建擴展點。

              2、一個穩定的接口:客戶端依賴接口,如果接口發生變化,客戶端也需要做響應的改變。用於表達擴展點的所有接口應該是穩定的,接口改變的可能性和頻率應該很低,否則所有依賴的客戶端都需要進行修改。

              3、足夠的自適應能力:只在合適的位置上包含恰當數目的擴展點的代碼被稱爲代碼的“宜居帶”。他能適應代碼的變更需求,同時也不會增加複雜度和過度設計方案。

             

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