裝飾器模式
1、裝飾器模式(Decorator),可以動態地添加修改類的功能
2、一個類提供了一項功能,如果要修改並添加額外的功能,傳統的編程模式,需要寫一個子類去繼承它,並重新實現類的方法。
3、使用裝飾器模式,僅僅需要在運行時,添加一個裝飾器對象即可實現,可以實現最大的靈活性。
代碼部分
注意:這裏借用"原型模式"的canvas的類,來對裝飾器模式進行實現。
1、如果想要給畫的圖,進行裝飾,比如,給圖設定個顏色,傳統的方式該如何實現?
傳統編程方式,就是在draw方法前後,添加修飾屬性。若僅僅是增加一兩個屬性,這種方式,沒有問題,但是,如果有多重屬性要進行修飾,這種方法,將會變得很臃腫,非常不利擴展。
2、這時,裝飾器模式,就閃亮登場了,因爲,我們在實際應用開發中,遠遠比預想的要複雜,所以,要保證代碼的解耦、複用、簡潔、高效,就必須選用優質的模式——裝飾器。
3、那麼,裝飾器模式該如何實現呢?借用canvas類,對其所畫的圖,進行顏色、大小的裝飾。首先,定義一個裝飾器接口,接口中,兩個待實現的方法,beforeDraw和afterDraw,如下:
4、這個時候,我們需要定義兩個裝飾類型裝飾器類,裝飾顏色的colorDrawDecorator類,裝飾大小的sizeDrawDecorator類,用以對drawDecorator接口,進行實現!
colorDrawDecorator類
sizeDrawDecorator類
5、那麼,具體地放到畫圖類中,我們要如何完美地,將裝飾器模式應用其中呢?下看代碼:
動態地加載裝飾器類,是個難點!理解上,也是個難點!另外,調用裝飾器方法,在是實現繪畫前的方法,要對裝飾器器容器中的每個元素遍歷,然後,實現繪畫前方法,對每個“*”添加“屬性”,每個點“*”都需要添加屬性,繪畫後方法,也需同樣,加屬性結束標籤。
但是,繪畫後方法,需要對裝飾器容器進行反轉,這個怎麼理解呢,就是在對每個元素添加“前屬性標籤”,裝飾器容器中的內容,最後一個就放到了第一個元素位置,第一個放到了最後一位,反轉一下,剛剛對上。然後,再順序對每個容器元素,添加繪畫後方法,即添加“結束屬性標籤”。
6、最後,就是調用了。
這裏,我們只實例了一次Canvas類,然後,對繪圖操作,增加了兩個裝飾,顏色和大小,加了裝飾,效果怎麼樣呢,通過瀏覽器,看一下:
如果我們不想用顏色裝飾器,直接註釋就可以,想用了,再放開,也不影響,很方便
瀏覽器:
總結:
裝飾器模式,方便的地方,就是低耦合、可拆可卸,但,難點在於,將裝飾器類動態地加載到應用類裏面,再對裝飾器接口,進行實現,這塊得理解清楚,細心操作,纔會讓裝飾器真正意義上發揮作用。調用的時候,就方便了,可用可卸!總之,多操作,多應用,多想,才能熟練爲之!