以前沒有接觸過裝飾者模式,昨天簡單研究了一下,記錄一下,為以后進一步學習鋪墊一下,剛剛接觸,有不對的地方歡迎大家指正。
首先,什么是裝飾者模式?
先舉個例子來說,就像是一條生產蛋糕的流水線,你不能用這條流水線去生產汽車,更不能去生產坦克吧,當然你也生產不了。你的蛋糕生產出來了,要保存吧,要銷售吧,你總不能把人家要吃的東西直接放地上直接放在車上吧,因此你需要盒子,你需要蛋糕的底座,那么盒子和底座就是你對蛋糕的包裝,也就是裝飾。至于盒子和底座的顏色啊,形狀啊,你完全可以多種多樣,想怎么組合就怎么組合。
例子可能不太恰當,但是道理卻是這樣的。裝飾者模式就是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。這是官方的解 釋,什么意思呢?就是說現在又一個類,你不能去改變這個類,也不能去改變這個類原來的繼承關系,但是還要動態的去擴展這個類的實例化的一個對象的功能,怎 么擴展對象的功能呢?去創建一個新的包裝對象,用你創建的包裝對象去將原來的對象包裹起來,以達到擴展原來對象的目的。
其次,裝飾者模式有什么特點?
1.裝飾者和被裝飾者有繼承自相同的超類。
2.被裝飾者可以被多個裝飾者同時裝飾。
還是上面的生產蛋糕,你可以在蛋糕上加上奶油,那就變成了奶油蛋糕,加了奶油之后你又想吃水果,那你還可以在加了奶油的蛋糕上加上水果,加了水果你還覺得不爽,還想加點 巧克力,這是完全可以的。不管你想吃什么都可以往上加(加多了最后還能不能吃我就不知道了,大家可以試試),蛋糕東西加多了可能不能吃,但是被修飾者卻是可以被多個修飾者同時 修飾的,但是修飾者的數量和修飾者添加的順序要根據具體的需求來添加,并不是說可以被多個修飾者修飾那么就可以隨便添加,你給蛋糕加四個汽車轱轆試試,看看會不會有人不打死 你?
3.裝飾模式中使用繼承的關鍵是想達到裝飾者和被裝飾對象的類型匹配,而不是獲得其行為。
裝飾者和被裝飾者之間必須是一樣的類型,也就是要有共同的超類。在這里應用繼承并不是實現方法的復制,而是實 現類型的匹配。因為裝飾者和被裝飾者是同一個類型,因此裝飾者 可以取代被裝飾者,這樣就使被裝飾者擁有了裝飾者獨有的行為。根據裝飾者模式的理念,我們可 以在任何時候,實現新的裝飾者增加新的行為。如果是用繼承,每當需要增加新的行為時,就要 修改原程序了。
4.與繼承的區別
學JAVA的,大家肯定也知道什么是繼承,我就不廢話了。初看裝飾者模式真的很像繼承,但是仔細看的話還是有很大區別的。使用繼承進行功能擴展,那么你要擴展的這些功能必 須是可以預見的,在編譯階段就已經確定了,在運行期不可改變,是靜態的,并且所有的子類都會繼承到相同的行為。但是裝飾者模式對于功能的擴展是可變的,裝飾者模式利用組合的 方法擴展對象的行為,就可以再運行時動態的擴展。
新聞熱點
疑難解答