關於「裝飾者模式」的一點粗淺理解

2021-08-26 08:30:34 字數 1569 閱讀 9499

裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構(主要目的在於增強介面,而不是擴充套件介面)。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。

黑體字就是關鍵字,要想用好該模式,就必須體會著幾個關鍵字的意圖;

在 head first設計模式 書中提了這樣乙個例子,原先有各種飲料,飲料具有beverage基類,在該基類下有好幾個實現類如tea,coffee,等;注意此時是已經有了基類,但是由於當時沒有很好的設計該系統,現在遇到了新需求,要求推出奶味tea,摩卡咖啡等等;

注意到,該模式主要用在之前設計系統時沒有很好的考慮未來需求(如果你預料到了新需求,你或許會使用其他方式,此時裝飾器模式就可能不具備競爭力了),現在要新增新功能為類新增新功能,出於**復用觀點(你要是已經發布的原始碼,那當我沒說,基本的:對擴充套件開放,對修改關閉原則),不改變結構,此時你可以考慮使用裝飾器模式去適應新需求;他是怎麼做的呢?

不妨分析jdk**:

最為經典的使用就是jdk的stream相關了

如下:

如上filterinputstream繼承了inputstream,但是沒有提供比inputstream更多的功能,目的在於增強inputstream介面,而filterinputstream內部還使用了乙個inputstream的域,基於此inputstream在實現中增強介面,這是其精華所在,這就是典型的裝飾者模式類圖;

當然了,裝飾者模式是比較簡單的了,但正是因為簡單,很多人或許沒完全明白其使用就在類名上體現出來給人造成誤解;

比如 往往拿來與之討論的就是proxy(**)模式,兩者有著幾乎相似的類圖,如下:

兩者都是利用組合來達到目的 ;

實際上,很多模式都是使用組合來達到目的,一直在強調目的兩個字,事實上模式之間的不同大多源於其目的不同,實現上是很類似的;

裝飾者模式目的在於「包裝同一介面物件,並在此基礎上提供額外功能」;

介面卡模式目的在於「包裝不同介面的物件,將其轉化為指定介面的物件」;

**模式目的在於「包裝同一介面物件,並控制其訪問」;

在這種意義上來說,aop總體上是裝飾者模式(增加了新功能),但其內部使用的**物件屬於**模式(獲得了**物件);

其實,真正的純**模式就是遠端**,目的是控制物件訪問的,如防火牆**,rpc物件等等,都是這樣,沒有增加新功能,達到的目的是控制物件訪問!

python關於裝飾器的一點小理解

越來越感覺,對於一些術語,真的不能看了名字就想著用自己的 語言 想法 去試著解釋,比如socket 套接字,再比如裝飾器,僅憑字面意思,很難理解的,反而會把你帶到坑里去 def f1 fn defaction return fn return action f1def test return is ...

關於裝飾者模式的一些理解

裝飾者模式,主要是為了解決在對類進行擴充套件過程中可能出現的子類 並同時滿足 對擴充套件開放,對修改封閉 的原則。我們以遊戲中的 作為例,遊戲中的 有基本的傷害值,有附加的特效,特效的種模擬較多,且同乙個 會帶有多種特效,例如傷害增強10 攻擊速度增強20 等等,若採用繼承的方式來做,就會產生子類 ...

line height的一點粗淺認識

line height 有5種不同型別的單位。line height normal inherit 繼承 百分比 20px 畫素值 1.2 倍數 將行高和字型大小結合 1 body 行高屬性 如果父元素是行高結合字型大小,繼承的屬性只與父元素字型大小有關,與子元素字型大小無 使用normal和倍數除...