一句話:需要包裝,但不改變本質(同宗同源)。
在不改變原有物件的基礎之上,將功能附加到物件上。提供了比繼承更有彈性的替代方案(擴充套件原有物件功能)
特點:1、注重覆蓋、擴充套件。
2、裝飾器和被裝飾器都實現同乙個介面,主要目的是為了擴充套件之後依舊保留 oop 關係(同宗同源)。
3、滿足 is-a 的關係。
擴充套件乙個類的功能或者給乙個類新增附加職責
給乙個物件動態的新增功能,或動態撤銷功能。
io 流包裝
filterinputstream filterinputstreasm = new bufferedinputstream(new fileinputstream(new file("/user/a")));
前台表單頁面填寫中文,通過servlet請求傳遞到後台,如果不經過任何處理,前台預設通過utf-8編碼,後台預設iso-8859-1解碼,編碼方式的差異難免造成亂碼問題,可以用裝飾者模式處理該問題。
簡歷包裝
一般當我們需要在具體的類中都需濤執行一些特定的操作時。我們一般就會使用抽象類,並定義抽象方法。
要點:(1)抽象元件(component):給出乙個抽象介面,以規範準備接受附加責任的物件。
(2)被裝飾者(concretecomponent):component的具體實現,也就是我們要裝飾的具體物件。
(3)裝飾者元件(decorator):持有元件物件的例項引用,該類的職責就是為了裝飾具體元件物件,定義的基類。
(4)具體裝飾(concretedecorator):負責給構件物件裝飾附加的功能。
總結起來就是,如果想對乙個行為在不改變原來基礎上加新功能和擴充套件,首先先把該行為抽象出來。然後實現抽象行為,原來的行為具體實現該抽象行為,建立乙個抽象行為也實現同乙個抽象行為,如果要裝飾的時候,再在具體實現該裝飾抽象類。
使用案例:
絞盡腦筋想不到很好的案例,網上很多其他的案例可以參考,但大部分都是賣東西
下面就結合自身寫個案例吧
作為一名技術宅程式設計師,166的身高普通的樣貌,不善言辭的嘴巴,至今一直單身,家裡人為止著急上火,本人也很無奈,被嫌棄太多,習慣成自然,以後要自信。
下面用裝飾模式給自己裝飾一番,看魅力值有沒有提高半分。
開擼://原來抽象 的我
public inte***ce abstractmyself
//原來的我
public class myself implements abstractmyself
@override()
@override
public string getspeech()
}
//抽象裝飾後的我
public abstract class abstractdecorator implements abstractmyself
@override
public long
getheight()
@override()
@override
public string getspeech()
}
//具體裝飾後的我
/**
* 提公升後的我
*/public class promotemyself extends abstractdecorator
//穿增高鞋
@override
public long
getheight()
@override()
@override
public string getspeech()
}
//測試
裝飾者設計模式 通俗易懂
精選30 雲產品,助力企業輕鬆上雲!裝飾模式 在不改變 原有類 和 不使用繼承的情況下,動態地擴充套件乙個物件的功能。因會建立乙個包裝物件,來包裹真實物件而得名。作用 增強物件的功能 例子1 牆 功能 遮風擋雨 包了牆紙的牆 本質還是牆 原功能 遮風擋雨 新增功能 陶冶情操 1 沒有改變原有類 2 ...
通俗易懂的裝飾器模式
裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。意圖 動態地給乙個物件新增一些額外的職責...
通俗易懂理解建造者模式
當乙個產品的構建過程是固定且複雜多變的,則可以將該產品的構建過程抽象出來。從乙個簡單的例子出發 比如 組裝一台電腦,你一定需要有cpu 主機板 記憶體 硬碟以及io外設。而每個部分你都可以選擇不同的型別 cpu可以是arm或者intel,記憶體可以是臺電的或是三星的等等。這樣的話,如果將構建電腦的過...