裝飾器模式/包裝器模式

在電視劇《相愛十年》中,主角肖然把出現(xiàn)了品控問題的安爾雅肥皂換了個包裝贱鄙、改了套說辭變成了全新的品牌浴雪清缤至,并成功的推銷出去了潮罪,得到了第一桶金康谆。這就說所謂的包裝,本質(zhì)上并沒有改變嫉到,但是外在表現(xiàn)形式上有了改動沃暗,給人感覺這好像是一個全新的物種一樣。

日光之下并無新事何恶,這話出自《圣經(jīng)》孽锥,講的就是這道理。

在編程領(lǐng)域同樣會存在這種包裝的需求细层,比如我們需要更改某個類的行為惜辑,但它是 final 類型的,不能繼承疫赎∈⒊牛或者是干脆就不想繼承,想通過組合的方式去包裝它捧搞,以達(dá)到這種修改對象行為的目的抵卫。

比如 JavaWeb 中的 HttpServletRequestWrapper 類就是一個典型的包裝器類,它就是應(yīng)用了包裝器設(shè)計模式的思想胎撇。這個類持有了原有的 request 對象介粘,實現(xiàn)了 ServletRequest 接口,重寫了它的所有方法创坞,并提供了針對 HTTP 協(xié)議的個性化功能碗短。

該設(shè)計模式中有幾個角色

學(xué)習(xí)啟示:學(xué)習(xí)設(shè)計模式的過程中,搞清楚這個模式里面有幾個角色题涨,也就是有幾個對象偎谁,理順?biāo)麄兊年P(guān)系,也就理解了這個設(shè)計模式纲堵。

在包裝器模式中從根本上來說巡雨,就只有被包裝對象和包裝對象。他們之間是一種組合關(guān)系席函,包裝對象內(nèi)部持有了被包裝對象铐望,并提供了一些被包裝對象所沒有的擴(kuò)展行為。多出來或者改動的行為就是包裝茂附!

如何實現(xiàn)包裝器模式/裝飾器模式

「英文時間」:decorator n. 裝飾器
「英文時間」:wrapper n. 包裝材料

包裝器設(shè)計模式的核心就是正蛙,通過組合和繼承同一個接口的方式,不需要更改的行為就用默認(rèn)實現(xiàn)营曼,需要更改的就自定義修改乒验。

下面還是以一個上面安爾雅和浴雪清肥皂的例子來講解具體的代碼如何寫,UML 類圖和具體操作步驟如下:


裝飾器模式.png
  • 第一步:定義包裝類和被包裝類共同的接口
  • 第二步:定義被包裝類蒂阱,并實現(xiàn)接口的方法
  • 第三步:定義包裝類锻全,并通過構(gòu)造函數(shù)接收被包裝類對象狂塘,將其作為內(nèi)部屬性持有。然后按照實際選擇修改或者新增行為鳄厌!

共同的接口:肥皂

//肥皂的接口
public interface Soap {
    void wash();
    void name();
}

被包裝類:安爾雅肥皂

//
class AnErYa implements Soap{
    @Override
    public void wash() {
        System.out.println("肥皂洗澡更干凈");
    }
    @Override
    public void name() {
        System.out.println("安爾雅");
    }
}

包裝類:浴雪清肥皂

class YuXueQing implements Soap{
    private Soap sopa;//持有被包裝類的引用
    public YuXueQing(Soap s) {
        this.sopa = s;//獲取被包裝類的引用
    }
    //修改被包裝對象的行為
    @Override
    public void name() {
        System.out.println("浴雪清");
    }
    //定義默認(rèn)實現(xiàn)
    @Override
    public void wash() {
        this.sopa.wash();
    }
    //浴雪清新增行為
    public void medicine(){
        System.out.println("中藥成分");
    }
}

測試代碼:

public static void main(String[] args) {
    Soap s1 = new AnErYa();
    Soap s2 =  new YuXueQing(s1);
    
    s2.wash();
    s2.name();
    YuXueQing y = (YuXueQing) s2;
    y.medicine();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荞胡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子了嚎,更是在濱河造成了極大的恐慌泪漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件新思,死亡現(xiàn)場離奇詭異窖梁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夹囚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纵刘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荸哟,你說我怎么就攤上這事假哎。” “怎么了鞍历?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵舵抹,是天一觀的道長。 經(jīng)常有香客問我劣砍,道長惧蛹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任刑枝,我火速辦了婚禮香嗓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘装畅。我一直安慰自己靠娱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布掠兄。 她就那樣靜靜地躺著像云,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚂夕。 梳的紋絲不亂的頭發(fā)上迅诬,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音婿牍,去河邊找鬼侈贷。 笑死,一個胖子當(dāng)著我的面吹牛牍汹,可吹牛的內(nèi)容都是我干的铐维。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慎菲,長吁一口氣:“原來是場噩夢啊……” “哼嫁蛇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起露该,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睬棚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后解幼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑党,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年撵摆,在試婚紗的時候發(fā)現(xiàn)自己被綠了底靠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡特铝,死狀恐怖暑中,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲫剿,我是刑警寧澤鳄逾,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灵莲,受9級特大地震影響雕凹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜政冻,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一枚抵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赠幕,春花似錦俄精、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逆屡,卻和暖如春圾旨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魏蔗。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工砍的, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莺治。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓廓鞠,卻偏偏與公主長得像帚稠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子床佳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 參考資料:菜鳥教程之設(shè)計模式 設(shè)計模式概述 設(shè)計模式(Design pattern)代表了最佳的實踐滋早,通常被有經(jīng)驗...
    Steven1997閱讀 1,174評論 1 12
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用砌们、多...
    MinoyJet閱讀 3,947評論 1 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杆麸,服務(wù)發(fā)現(xiàn),斷路器浪感,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 人想要要改變自己的命運(yùn)是需要多大的勇氣
    DABO_ce35閱讀 150評論 0 0
  • 男人喜歡什么樣的女人呢昔头? 男人喜歡一無所有的女人,沒有夢想?yún)s傻傻支持男人夢想的女人影兽。 涼子今年就32歲了揭斧。 現(xiàn)在是...
    風(fēng)子啊閱讀 694評論 0 1