1. 程式人生 > >設計模式——裝飾模式詳解

設計模式——裝飾模式詳解

0. 前言

寫在最前面,本人的設計模式類博文,建議先看博文前半部分的理論介紹,再看後半部分的例項分析,最後再返回來複習一遍理論介紹,這時候你就會發現我在重點處標紅的用心,對於幫助你理解設計模式有奇效哦~本文原創,轉載請註明出處為的部落格

裝飾模式是結構型設計模式之一,使用一種對客戶透明的方式來動態拓展物件的功能,Java IO中各種流的巢狀就是裝飾模式的很好體現。

1. 裝飾模式介紹

裝飾模式定義:

動態地給一個物件新增一些額外的功能,比生成子類要靈活。

裝飾模式的使用場景:

需要透明且動態地拓展類的功能的場景。

裝飾模式包括的角色:

 

1)抽象元件Component類。

2)元件具體實現ConcreteComponent

類。也是被裝飾的物件

3)抽象裝飾類Decorator內部持有一個元件物件的引用,職責就是裝飾ConcreteComponent。之所以是抽象的,就是為了方便不同的裝飾“風格”子類的自定義實現。

4)具體裝飾類ConcreteDecorator

2.  裝飾模式例項介紹

想到裝飾,很容易想到一個人穿衣服,在不同的季節穿不同的衣服,比如夏天穿短褲、冬天穿毛褲,但是不管什麼季節,內褲肯定是要穿的。

抽象元件Component類就可以是抽象類Person,而ConcreteComponent類就可以是具體的一個人Calvin,也是要被裝飾的物件。抽象裝飾類Decorator持有了Calvin的引用,並且回調了

Calvin本身的一個“穿內褲”的行為,並且在具體的裝飾類中,即“冬夏”兩個類中,分別為主人公Calvin穿上了毛褲和短褲,為物件增加了額外的功能。程式碼也比較簡單,如下所示。

/**
 * Decorator Pattern
 * Created by Calvin on 2017/5/10.
 */
public class Decorator {
    public static void main(String[] args) {
        Person calvin = new Calvin();
        PersonCloth summerCloth = new SummerCloth(calvin);
        PersonCloth winterCloth = new WinterCloth(calvin);
        summerCloth.dressed();
        winterCloth.dressed();
    }

    public static abstract class Person{
        public abstract void dressed();
    }

    public static class Calvin extends Person{
        @Override
        public void dressed() {
            System.out.println("穿件內褲");
        }
    }

    public static abstract class PersonCloth extends Person{
        Person myPerson;

        public PersonCloth(Person myPerson) {
            this.myPerson = myPerson;
        }

        @Override
        public void dressed() {
            myPerson.dressed();
        }
    }

    public static class SummerCloth extends PersonCloth{

        public SummerCloth(Person myPerson) {
            super(myPerson);
        }

        @Override
        public void dressed() {
            super.dressed();
            System.out.println("穿件短褲");
        }
    }

    public static class WinterCloth extends PersonCloth{

        public WinterCloth(Person myPerson) {
            super(myPerson);
        }

        @Override
        public void dressed() {
            super.dressed();
            System.out.println("穿件毛褲");
        }
    }
}

3.  裝飾模式總結

裝飾模式動態地給一個物件新增一些額外的功能,相對於繼承的方式,更加靈活。

裝飾模式經常被誤認為是代理模式。裝飾模式是以對客戶透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。而代理模式則是給一個物件提供一個代理物件,並由代理物件來控制原有物件的引用

前者重在增加功能,後者重在對代理物件施加控制,不是對物件本身功能的增強。


相關推薦

設計模式——裝飾模式

0. 前言寫在最前面,本人的設計模式類博文,建議先看博文前半部分的理論介紹,再看後半部分的例項分析,最後再返回來複習一遍理論介紹,這時候你就會發現我在重點處標紅的用心,對於幫助你理解設計模式有奇效哦~本

Java設計模式之享元模式實例

AI ava flyweight lan trac home erro lin 代碼 本文實例講述了Java設計模式之享元模式。分享給大家供大家參考,具體如下: 解釋一下概念:也就是說在一個系統中如果有多個相同的對象,那麽只共享一份就可以了,不必每個都去實例化一個對象。比如

java設計模式(23種)

設計模式(Design Patterns)                                   ——可複用面向物件軟體的基礎 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他

android設計模式之mvp

1,mvp模式介紹 mvp全稱model,view,presenter,目前mvp在 android應用開發中越來越屌,大家對mvp模式討論也越來越多,如果做了n年開發以後你還是簡單的呼叫api,簡單的堆程式碼,就太丟丟了,mvp能夠有效的降低view

設計模式六大原則

引言 對於設計模式,自己很早之前就看了好多本設計模式書籍,其中一些還看了好幾遍,也一直希望自己能在編碼的時候把這些設計模式用上去。可是,在日常的打碼中,用的做多的就是單例,其次是觀察者和建造者模式 ( builder ) 用得比較多,其他的基本很少用到。 用不到的原因是還是不能夠理解設計模式的思想,無法將這些

小程序商城系統開發模式平臺搭建

小程序 效果 商機 應用場景 模式 找到 成本 時代 哪些 小程序商城系統開發(李想.185.6504.8478)隨著移動互聯網的深入普及,流量碎片化的趨勢無法逆轉,百度、淘寶等平臺成本越來越高,效果卻越來越差,企業單一流量入口保持增長的時代結束。小程序二維碼多入口的訪問形

Javascript 嚴格模式(strict mode)

eval ref 條件 ssa for this關鍵字 表示法 ocs 行為 Javascript 嚴格模式詳解 一、概述 除了正常運行模式,ECMAscript 5添加了第二種運行模式:"嚴格模式"(strict mode)。顧名思義,這種模式使得Jav

設計模式——裝飾模式

decorator text err span 方法 切換 rtu .text 指標 一、簡介 裝飾模式(Decorator)又名包裝器(Wrapper),屬於結構型模式的一種,采用遞歸的思想,用於包裝類,使其功能豐富。 例如:有一個統計圖表控件,可能需要有圖/表切換的功能

火爆的車享家模式系統開發

目前 聯合體 移動互聯網 體系 通過 系列 獲得 com img 車享家是一個關於用車的全方位平臺!上線至今都十分火熱,盈利能力也強,通過結合“高效線上運營”和“優質線下服務”,全方位打通汽車“看、選、買、用、賣”,簡單來看,是淘寶+o2o的聯合體。目前汽車市場蓬勃發展,汽

設計模式 - 裝飾模式

void 去除 ora () override collect fin app names 裝飾模式(Decorator):動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 1 using System; 2 using System.

大話設計模式--裝飾模式 C++簡單例子

span 例子 簡單例子 new pre virt != code decorator 裝飾模式在對象動態增加功能方面優於繼承,用裝飾模式替代繼承,比繼承更加靈活。 小菜扮靚第三版 class person { public: virtual void show(

大話設計模式——裝飾模式和代理模式(一)

區別 接口 需要 構圖 技術分享 開閉 tro 可能 code 1、是什麽? 裝飾模式:動態地給一個對象添加額外的職責。 代理模式:其他對象通過對象A去訪問對象B。 2、為什麽用? 裝飾模式:1、遵循開閉原則,盡量不去修改原有的類。2、裝飾對象一般都是添加額外的

百惠優美模式APP開發

百惠優美模式開發【張玲:⒈⒌⒍微⒉⒉⒎⒏電⒈⒌⒉⒏】,百惠優美模式商城系統開發,百惠優美系統平臺開發,百惠優美商城APP開發 Resource creation-資源創造。資源建立可能涉及分配新記憶體,將其對映到您的程序,並將其填充為零。通過從較大的堆或由堆支援的可迴圈資源記憶體建立資源,可以降低此成本。

大話設計模式--裝飾模式

裝飾模式:動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。 Component是定義了一個物件介面,可以給這些物件動態地新增職責,ConcreteComponent是定義了一個具體的物件,也可以給這些物件新增一些職責。Decorator,裝飾抽象類,繼承

軟考設計模式——裝飾模式(C++)

裝飾模式就是在不改變原來介面的情況下,給類新增功能。 舉個例子,在遊戲裡玩一個英雄,可以拿裝備,拿的這些個裝備就相當於是在裝飾自己。 其實有一個訣竅,就是這些類裡有一個方法名字都一樣,然後這些類先從外到內,然後從裡面開始一層層向外巢狀呼叫,相當於一直給這個方法里加東西

GPIO模式配置與

一、GPIO配置 (1)GPIO_Mode_AIN 模擬輸入  (2)GPIO_Mode_IN_FLOATING 浮空輸入 (3)GPIO_Mode_IPD 下拉輸入  (4)GPIO_Mode_IPU 上拉輸入  (5)GPIO_Mode_Out_OD 開漏輸出 (6

C++設計模式——裝飾模式

前言 在實際開發時,你有沒有碰到過這種問題;開發一個類,封裝了一個物件的核心操作,而這些操作就是客戶使用該類時都會去呼叫的操作;而有一些非核心的操作,可能會使用,也可能不會使用;現在該怎麼辦呢? 將這些非核心的操作全部放到類中,這樣,一個類就包含了很多核心的操作和一些看似有關,但是又無關的操作;這就會

【程式設計素質】設計模式-裝飾模式(Decorator,包裝模式Wrapper)

1,概念 是動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 是以對客戶端透明的方式擴充套件物件的功能,換句話說,客戶端不會察覺到裝飾前與裝飾後有什麼不同。 在不

設計模式--裝飾模式

裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。 1.裝飾模式的結構 裝飾模式以對客戶透明的方式動態地給一個物件附加上更多的責任。換言之,客戶端並不會覺得物件在裝飾前和裝飾後有什麼不同。裝飾模式可