設(shè)計(jì)模式是一套被在實(shí)際使用中刺下,總結(jié)出來的一些代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)染乌,學(xué)習(xí)設(shè)計(jì)模式有助于理解框架的結(jié)構(gòu)。成熟的框架通常使用了多種設(shè)計(jì)模式,如果你熟悉這些設(shè)計(jì)模式垮斯,毫無疑問,對于快速掌握框架的結(jié)構(gòu)有很大的幫助只祠。
主要功能
? 如其名兜蠕,主要功能就是裝飾,就是夠在不改變原類文件抛寝、和不使用繼承的情況下熊杨,動態(tài)擴(kuò)展一個對象的功能和職責(zé)。裝飾模式是通過將真實(shí)的對象包裹起來盗舰,然后對其進(jìn)行裝飾晶府,并一層一層的傳遞下去,逐層裝飾钻趋,直到裝飾完成川陆。
簡單的說就是,在不違背開放-封閉原則的情況下蛮位,動態(tài)為一個對象增加一系列功能和職責(zé)
UML類圖結(jié)構(gòu)
裝飾模式中的角色
- 抽象構(gòu)件角色(Component): 一個抽象的接口较沪,用來規(guī)范被裝飾對象鳞绕。
- 具體構(gòu)造角色(ConcreteComponent ):業(yè)務(wù)場景比較簡單,Component和ConcreteComponent的角色可以合并成一個
- 裝飾角色(Decoretor):持有一個抽象構(gòu)件角色的引用尸曼,并通過構(gòu)造方法或者set方法们何,對其賦值
- 具體的裝飾角色(ConcreteDecoretor): 業(yè)務(wù)場景比較簡單時,ConcreteDecoretor和Decoretor兩個的角色可以合并為一個
對模式的理解
裝飾角色持有一個被裝飾對象的引用控轿,在轉(zhuǎn)發(fā)請求前后增加附加的功能冤竹,實(shí)現(xiàn)對被裝飾對象功能的擴(kuò)展,并將當(dāng)前裝飾角色再依次傳遞給下一個具體的裝飾角色茬射,完成一系列的裝飾贴见,達(dá)到最終的效果
關(guān)鍵字
? 動態(tài)擴(kuò)展 、 依次傳遞
因?yàn)樾枰獙?你"進(jìn)行
動態(tài)擴(kuò)展
躲株,不能使用繼承(繼承是屬于靜態(tài)行為片部,無法做到動態(tài)改變,同時繼承會違反開閉原則)霜定,所以裝飾角色需要持有一個被裝飾對象的引用档悠,可以通過set方法、構(gòu)造方法對其初始化和對象的傳遞
望浩。-
裝飾角色為什么需要實(shí)現(xiàn)和被裝飾對象相同的接口辖所,因?yàn)樾枰?strong>
依次傳遞
到不同的具體裝飾角色中,方法參數(shù)類型必須一致特點(diǎn)
裝飾模式的對裝飾順序敏感
裝飾模式構(gòu)造過程相比于建造者模式是不穩(wěn)定的
可以分離對象的核心職責(zé)與裝飾功能
更容易利用功能磨德,把復(fù)雜的功能分散到每一個裝飾器中缘回,有利于利用利用,同樣也會產(chǎn)生很多細(xì)粒度的對象
應(yīng)用場景
- ? 裝飾模式在JAVA中最典型的應(yīng)用應(yīng)該就是I/O流了
- ? 通過裝飾模式實(shí)現(xiàn)消息的加密解密
- ? 通過裝飾模式實(shí)現(xiàn)類似AOP的功能
- ? 其它場景