定義:
軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的。
個人理解:
開閉原則通俗的來說就是軟件系統中包含的各種組件,例如模塊(Modules)、類(Classes)以及功能(Functions)等等,應該在不修改現有代碼的基礎上,引入新功能。開閉原則中“開”,是指對於組件功能的擴展是開放的,是允許對其進行功能擴展的;開閉原則中“閉”,是指對於原有代碼的修改是封閉的,即不應該修改原有的代碼。
問題由來:
在軟件的生命周期內,由於需求變動、維護和升級需要對項目部分代碼修改時,可能使沒修改的部分發生錯誤,這就需要對沒修改的部分也要進行測試。
解決方案:
軟件需要變化時,盡量通過擴展原來實體完成修改而不是修改原來代碼,也就是說用抽象構建框架,用實現擴展細節。
其實,開閉原則整個的定義比較模糊,它只是描述了軟件中的對象對於擴展開放,對於修改關閉,但沒有說如何實現。開閉原則算是前5中原則的一個抽象總結,前五種是開閉原則的一些具體實現,所以如果使用開閉原則,其實有點虛,因為它沒有一個固定的模式,但是最終保證的是提高程序的復用性、可維護性等要求。
聯系到前面所說的設計模式原則中的SOLID(單一職責原則、開閉原則、裡氏替換原則、接口隔離原則和依賴倒置原則)以及迪米特法則,將設計模式六大原則除去開閉原則的設計模式原則實現了,也就完成了開閉原則。但是要明確一點,這些原則的實現不是是與否,而是實現的程序是多少。前面所介紹的設計模式前5大原則的作用如下:
最後說明一下如何去遵守這六個原則。對這六個原則的遵守並不是是和否的問題,而是多和少的問題,也就是說,我們一般不會說有沒有遵守,而是說遵守程度的多少。任何事都是過猶不及,設計模式的六個設計原則也是一樣,制定這六個原則的目的並不是要我們刻板的遵守他們,而需要根據實際情況靈活運用。對他們的遵守程度只要在一個合理的范圍內,就算是良好的設計。
去百度查一下 裡氏代換原則,這是設計模式的基礎6大設計原則之一
單一職責、裡氏替換(代換)、依賴倒置、接口隔離、迪米特法則、開閉原則
或者直白地說,就是你要搞懂as3.0的 一個統一,兩大分支,事件驅動
一個統一是所有顯示對象歸屬繼承自 flash.display.DisplayObject類
其下分兩大分支
第一分支 flash.display.InteractiveObject (可交互對象) 和 不可交互對象
第二分支 flash.display.DisplayObjectContainer(容器對象) 和 非容器對象
而使用到 向上轉換和向下轉換的情況 在使用事件時很常見
如平時我們
mc.addEventListener(MouseEvent.CLICK, onClick_func);
function onClick_func(_evt:MouseEvent):void{
var _mc:MovieClip = _evt.target as MovieClip;
//這個事件處理函數中 _evt.target as MovieClip; 就使用了向下轉換,把事件傳遞中的
// flash.display.DisplayObject 類型 轉換成其子類 flash.display.MovieClip
}
向上轉換
比如
function setX(_obj:DisplayObject):void{
_obj.x = 100;
}
這個函數的參數使用了 父類 DisplayObject作為類型,那麼表明調用這個函數傳入的參數可以是所有DisplayObject的子類 比如 MovieClip ,比如 SimpleButton ,比如 TextField(文本框) 等等
子類 父類都是基於接口的向上轉換或向下轉換來應用的
開-閉”原則,即“對擴展開放,對修改關閉”,指的是在軟件設計中,當對某一軟件實體進行擴展時,盡量不要去修改原有的軟件實體,換句話說就是在不修改原有軟件實體的情況下對其進行擴展。這種軟件設計方式其實是一種目標,它考慮了軟件後期的維護等其它因素。一個軟件系統如果可以達到這個目標,那它就是可擴展、易維護的。在軟件設計中,眾多的設計模式的應用就是為了達到這個目標。