設計模式——裝飾者模式

爲何使用裝飾者模式?java

好比說,咱們如今須要一杯奶茶,以後咱們還想往奶茶里加入珍珠,椰果。spa

可是若是直接修改奶茶的類,不符合咱們儘可能少修改原類的原則。設計

因此咱們須要一種不須要修改原類,就能夠爲原類增添新屬性的方法。對象

什麼是裝飾者模式?繼承

定義:動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。io

裝飾模式是在沒必要改變原類文件和使用繼承的狀況下,動態地擴展一個對象的功能。它是經過建立一個包裝對象,也就是裝飾來包裹真實的對象。擴展

設計原則:類應該對擴展開放,對修改關閉。程序

實現方法

裝飾者和被裝飾者之間必須是同樣的類型,也就是要有共同的父類。由於裝飾者和被裝飾者是同一個類型,所以裝飾者能夠取代被裝飾者,這樣就使被裝飾者擁有了裝飾者獨有的行爲。根據裝飾者模式的理念,咱們能夠在任什麼時候候,實現新的裝飾者增長新的行爲。若是是用繼承,每當須要增長新的行爲時,就要修改原程序了。im

問題解決

咱們可讓奶茶和CondimentDecorator都有共同的父類Beverage,以後再由CondimentDecorator派生出珍珠、椰果等做料的子類。

若是咱們要加入珍珠,咱們能夠直接將奶茶(或者已經添加了一些屬性的奶茶)做爲珍珠實例的一個屬性,也即Decorateor中必有一個指向父類Beverage的屬性。

也正由於奶茶和佐料都用共同的父類,因此佐料實例能夠直接取代奶茶實例。

應用如:輸入輸出流的一層層包裝

java.io.BufferedReader; java.io.FileReader; java.io.Reader;

相關文章
相關標籤/搜索