PHP - 設計模式之 裝飾器模式

裝飾器模式

1、裝飾器模式(Decorator),可以動態地添加修改類的功能

2、一個類提供了一項功能,如果要修改並添加額外的功能,傳統的編程模式,需要寫一個子類去繼承它,並重新實現類的方法。

3、使用裝飾器模式,僅僅需要在運行時,添加一個裝飾器對象即可實現,可以實現最大的靈活性。

 

代碼部分

注意:這裏借用"原型模式"的canvas的類,來對裝飾器模式進行實現。

1、如果想要給畫的圖,進行裝飾,比如,給圖設定個顏色,傳統的方式該如何實現?

傳統編程方式,就是在draw方法前後,添加修飾屬性。若僅僅是增加一兩個屬性,這種方式,沒有問題,但是,如果有多重屬性要進行修飾,這種方法,將會變得很臃腫,非常不利擴展。

 

2、這時,裝飾器模式,就閃亮登場了,因爲,我們在實際應用開發中,遠遠比預想的要複雜,所以,要保證代碼的解耦、複用、簡潔、高效,就必須選用優質的模式——裝飾器。

 

3、那麼,裝飾器模式該如何實現呢?借用canvas類,對其所畫的圖,進行顏色、大小的裝飾。首先,定義一個裝飾器接口,接口中,兩個待實現的方法,beforeDraw和afterDraw,如下:

 

4、這個時候,我們需要定義兩個裝飾類型裝飾器類,裝飾顏色的colorDrawDecorator類,裝飾大小的sizeDrawDecorator類,用以對drawDecorator接口,進行實現!

colorDrawDecorator類

sizeDrawDecorator類

 

5、那麼,具體地放到畫圖類中,我們要如何完美地,將裝飾器模式應用其中呢?下看代碼:

動態地加載裝飾器類,是個難點!理解上,也是個難點!另外,調用裝飾器方法,在是實現繪畫前的方法,要對裝飾器器容器中的每個元素遍歷,然後,實現繪畫前方法,對每個“*”添加“屬性”,每個點“*”都需要添加屬性,繪畫後方法,也需同樣,加屬性結束標籤。

但是,繪畫後方法,需要對裝飾器容器進行反轉,這個怎麼理解呢,就是在對每個元素添加“前屬性標籤”,裝飾器容器中的內容,最後一個就放到了第一個元素位置,第一個放到了最後一位,反轉一下,剛剛對上。然後,再順序對每個容器元素,添加繪畫後方法,即添加“結束屬性標籤”。

 

6、最後,就是調用了。

這裏,我們只實例了一次Canvas類,然後,對繪圖操作,增加了兩個裝飾,顏色和大小,加了裝飾,效果怎麼樣呢,通過瀏覽器,看一下:

如果我們不想用顏色裝飾器,直接註釋就可以,想用了,再放開,也不影響,很方便

瀏覽器:

 

總結:

裝飾器模式,方便的地方,就是低耦合、可拆可卸,但,難點在於,將裝飾器類動態地加載到應用類裏面,再對裝飾器接口,進行實現,這塊得理解清楚,細心操作,纔會讓裝飾器真正意義上發揮作用。調用的時候,就方便了,可用可卸!總之,多操作,多應用,多想,才能熟練爲之!

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