java實(shí)現(xiàn)裝飾器模式(Decorator Pattern)
一、什么是裝飾器模式
裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝。
這種模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi),并在保持類(lèi)方法簽名完整性的前提下,提供了額外的功能。
在不想增加更多子類(lèi)的情況下擴(kuò)展類(lèi),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō),裝飾器模式相比生成子類(lèi)更為靈活。
二、裝飾器模式的具體實(shí)現(xiàn)
1、結(jié)構(gòu)圖
2、分析
裝飾器模式由組件和裝飾者組成。
- 抽象組件(Component):需要裝飾的抽象對(duì)象。
- 具體組件(ConcreteComponent):是我們需要裝飾的對(duì)象。
- 抽象裝飾類(lèi)(Decorator):內(nèi)含指向抽象組件的引用及裝飾者共有的方法。
- 具體裝飾類(lèi)(ConcreteDecorator):被裝飾的對(duì)象。
3、java 代碼實(shí)現(xiàn):
抽象組件:
package com.designpattern.decoratorPattern; /** * Component 組件 抽象角色 * @author zhongtao on 2018/10/23 */ public interface House { /** * 裝飾風(fēng)格 */ void style(); }
具體組件:
/** * 具體組件 * @author zhongtao on 2018/10/23 */ public class ChineseStyle implements House { @Override public void style() { System.out.println("中式風(fēng)格裝修"); } } /** * 具體組件 * @author zhongtao on 2018/10/23 */ public class EuropeanStyle implements House { @Override public void style() { System.out.println("歐式風(fēng)格裝修"); } }
抽象裝飾類(lèi):
package com.designpattern.decoratorPattern; /** * 抽象裝飾類(lèi) * * @author zhongtao on 2018/10/23 */ public class HouseDecorator implements House { public House house; public HouseDecorator(House house) { this.house = house; } @Override public void style() { house.style(); } }
具體裝飾類(lèi):
package com.designpattern.decoratorPattern; /** * 具體裝飾類(lèi) * * @author zhongtao on 2018/10/23 */ public class RedDecorator extends HouseDecorator { public RedDecorator(House house) { super(house); } public void style() { this.house.style(); System.out.println("紅色裝飾墻"); } }
測(cè)試裝飾器模式:
package com.designpattern.decoratorPattern; import org.junit.Test; /** * 測(cè)試裝飾器模型 * * @author zhongtao on 2018/10/22 */ public class DecoratorPatternTest { /** * 測(cè)試裝飾器模型 */ @Test public void testDecoratorPattern(){ ChineseStyle chineseStyle = new ChineseStyle(); House redChineseStyle = new RedDecorator(new ChineseStyle()); House redEuropeanStyle = new RedDecorator(new EuropeanStyle()); System.out.println("中式裝修"); chineseStyle.style(); System.out.println("\n中式加紅色墻"); redChineseStyle.style(); System.out.println("\n歐式加紅色墻"); redEuropeanStyle.style(); } }
測(cè)試結(jié)果:
---中式裝修---
中式風(fēng)格裝修
---中式加紅色墻---
中式風(fēng)格裝修
紅色裝飾墻
---歐式加紅色墻---
歐式風(fēng)格裝修
紅色裝飾墻
三、裝飾器的優(yōu)缺點(diǎn)
1、優(yōu)點(diǎn)
- 裝飾類(lèi)和被裝飾類(lèi)可以獨(dú)立發(fā)展,不會(huì)相互耦合。
- 裝飾器模式是繼承的一個(gè)替代模式。
- 裝飾器模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能。
2、缺點(diǎn)
多層裝飾比較復(fù)雜。
源碼地址
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序
這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java),感興趣的小伙伴可以了解一下2022-12-12Java連接Oracle數(shù)據(jù)庫(kù)完整步驟記錄
數(shù)據(jù)庫(kù)的操作是當(dāng)前系統(tǒng)開(kāi)發(fā)必不可少的開(kāi)發(fā)部分之一,下面這篇文章主要給大家介紹了關(guān)于Java連接Oracle數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01SpringBoot下載文件的實(shí)現(xiàn)及速度對(duì)比
這篇文章主要介紹了SpringBoot下載文件的實(shí)現(xiàn)及速度對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12IDEA部署Docker鏡像的實(shí)現(xiàn)示例
本文主要介紹了IDEA部署Docker鏡像的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Jmeter正則表達(dá)式提取器實(shí)現(xiàn)過(guò)程圖解
這篇文章主要介紹了Jmeter正則表達(dá)式提取器實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08詳解servlet調(diào)用的幾種簡(jiǎn)單方式總結(jié)
這篇文章主要介紹了詳解servlet調(diào)用的幾種簡(jiǎn)單方式總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01