隨筆-200  評論-148  文章-15  trackbacks-0
          4.1 什么是開閉原則

          ☆ 開閉原則指的是一個軟件實體應對對擴展開發,對修改關閉(Software entities should be open for extension, but closed for modification)。這個原則是說在設計一個模塊的時候,應對使這個模塊可以在不被修改的前提下被擴展,換言之,應對可以不必修改源代碼的情況下 改變這個模塊的行為。

          ☆ 滿足開閉原則的軟件系統的優越性:
          ① 通過擴展已有的軟件系統,可以提供新的行為,以滿足對軟件的新需求,使變化中的軟件系統有一定的適應性和靈活性。
          ② 已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統有一定的穩定性和延續性。

          ξ4.2 實現開閉原則的關鍵
          抽 象化是解決問題的關鍵,在面向對象的編程語言里,可以給系統定義出一套相對較為固定的抽象設計,此設計允許無窮無盡的行為在實現層被實現。在語言里,可以 給出一個或多個抽象類或者接口,規定出所有的具體類必須提供的方法的特征作為系統設計的抽象層。這個抽象層預見了所有的可擴展性,因此,在任何擴展情況下 都不會改變。這就使得系統的抽象不需要修改,從而滿足了開閉原則的第二條,對修改關閉。
          同時,由于從抽象層導出一個或多個新的具體類可以改變系統的行為,因此系統的設計對擴展是開放的,這就滿足了開閉原則的第一條。

          ☆ 對可變性的封裝原則
          這是對開閉原則的另外一種描述,它講的是找到一個系統的可變因素,將之封裝起來。該原則意味著兩點:
          ① 一種可變性不應當散落在代碼的很多角落,而應當封裝到一個對象里面。繼承應當被看做是封裝變化的方法,而不應該被認為是一種從一般對象生成特殊對象的方法。
          ② 一種可變性不應當與另外一種可變性混合在一起。這意味著一般的繼承層次不會超過兩層。

          關鍵知識點:
          ☆ 開閉原則的概念,軟件實體對擴展開發,對修改關閉;
          ☆ 實現開閉原則的關鍵,利用接口或抽象類抽象出系統的抽象層,抽象層不變,利用實現層進行擴展;
          ☆ 對可變性的封裝,將可變的元素封裝起來,防止改變擴散到整個應用;
          ☆ 注意控制封裝的粒度,不要將兩種可變性封裝到一起;
          ☆ 繼承是用來封裝可變性的,一般的繼承層次不要超過兩層;
          ☆ 策略模式是對開閉原則的很好詮釋,其他還有工廠模式、建造模式、橋接模式、門面模式、調停者模式、訪問者模式和迭代子模式等;
          ☆ 對“將條件轉移語句改寫成多態性”的重構行為應當遵循開閉原則,防止多態性污染;
          ☆ java下的單方法接口通常用來實現函數指針或者委托的功能;
          ☆ 任何一棵繼承樹都要以抽象類為根,具體類不是用來繼承的,更不要從工具類繼承;
          ☆ 抽象類要擁有盡可能多的共同代碼,同時擁有盡可能少的數據。
          ☆ 當Coad條件全部滿足時,才應當考慮使用繼承:派生類是基類的一個特殊種類,而不是其的一個角色,也就是說要區分“Has-a”和“Is-a”;永遠不 會出現需要將派生類換成另外一個類的派生類的情況;派生類具有擴展基類的責任而不是具有置換或注銷基類的責任;只有在分類學角度上有意義時,才可以使用繼 承。?

          ?

          posted on 2008-02-01 09:21 無聲 閱讀(4900) 評論(1)  編輯  收藏 所屬分類: 職場生活

          評論:
          # re: 什么是開閉原則 2008-03-07 15:21 | wq
          設計的基礎知識了





          Java架構俱樂部,QQ群2826942 ,交流Java架構,領域模型,設計模式,AOP,IOC,輕量級,DDD,項目管理,設計思想等問題,聚集經驗豐富的高級程序員,架構師,項目經理等交流以上層面較高的問題。歡迎各位有識之士加入,共同探討、發表高見、廣結精英。為了使各位成員免受無聊信息和低端問題的打擾,請盡量避免討論代碼實現等入門級問題,維護本群的氛圍和討論質量。  回復  更多評論
            
          主站蜘蛛池模板: 彭州市| 岗巴县| 恩平市| 保靖县| 张北县| 曲阜市| 闻喜县| 浦北县| 大化| 建湖县| 遂昌县| 鹤壁市| 简阳市| 大石桥市| 安丘市| 开平市| 饶平县| 怀集县| 舒兰市| 贵南县| 汝城县| 西平县| 松江区| 英超| 简阳市| 侯马市| 灵山县| 万荣县| 德化县| 普定县| 汾阳市| 潜山县| 理塘县| 寻甸| 隆安县| 赤水市| 丹棱县| 彭山县| 雅安市| 肇庆市| 周宁县|