Java設(shè)計(jì)模式之裝飾模式詳解
1.什么是裝飾模式
當(dāng)我們想要改進(jìn)或增強(qiáng)某個(gè)對(duì)象的功能,而又不想繼承該類創(chuàng)建子類,可以考慮使用裝飾模式。
使用裝飾模式增強(qiáng)對(duì)象的某個(gè)功能,比生成子類再增強(qiáng),更為靈活。
2.如何實(shí)現(xiàn)
1)抽象組件:定義一個(gè)抽象類,該抽象類定義了“被裝飾者”需要被“裝飾的方法”
2)具體組件:抽象組件的一個(gè)子類。成為“被裝飾類”
3)裝飾組件:也是抽象組件的一個(gè)子類。該類中持有“被裝飾者”的引用,用來(lái)調(diào)用被裝飾者的方法??梢詾槌橄箢悾部梢允欠浅橄箢?。
4)具體裝飾類:是裝飾組件的一個(gè)子類,被稱為“裝飾者”
3.代碼實(shí)現(xiàn)
1)抽象組件
/**
* 抽象組件,定義了被裝飾類需要裝飾的方法
*/
public abstract class ICake {
/**
* 需要裝飾的方法
* @return
*/
public abstract int getPrice();
}2)被裝飾者
/**
* 被裝飾者,是抽象組件的一個(gè)子類,定義需要被裝飾的方法
*/
public class Cake extends ICake {
/**
* 被裝飾類中,裝飾方法的基本實(shí)現(xiàn)
* @return
*/
@Override
public int getPrice() {
System.out.println("getPrice");
return 100;
}
}3)裝飾類
/**
* 裝飾類,也是抽象組件的一個(gè)子類。
* 可以是抽象類,也可以是非抽象類。
*/
public abstract class CakeDecorator extends ICake {
/**
* 被裝飾類的引用,需要在裝飾類中,調(diào)用到被裝飾類的方法。
*/
ICake cake;
public CakeDecorator(ICake cake){
this.cake = cake;
}
}4)具體裝飾
/**
* 具體裝飾類
*/
public class BlueBerryCake extends CakeDecorator {
public BlueBerryCake(ICake cake) {
super(cake);
}
/**
* 被裝飾的方法
* 在調(diào)用到被裝飾類的基礎(chǔ)方法后,還要調(diào)用裝飾類要增強(qiáng)的方法
* @return
*/
@Override
public float getPrice(){
return cake.getPrice()+elsePrice();
}
/**
* 增強(qiáng)的方法
* @return
*/
private float elsePrice(){
System.out.println("else getPrice");
return 50;
}
}5)測(cè)試類
public class TestDecorator {
public static void main(String args[]){
ICake cake = new Cake();
CakeDecorator decorater = new BlueBerryCake(cake);
float price = decorater.getPrice();
System.out.println(price);
}
}4.拓展
1)利用子類繼承也能實(shí)現(xiàn)某個(gè)方法的增強(qiáng)。相比通過(guò)裝飾模式實(shí)現(xiàn),裝飾模式有和優(yōu)勢(shì)?
被裝飾者和裝飾者是松耦合關(guān)系。裝飾類僅僅依賴于抽象組件,裝飾類只需要知道被裝飾類是抽象組件的一個(gè)子類,而不必知道具體是哪個(gè)子類。
裝飾模式滿足“開(kāi)-閉原則”,不必修改具體組件,就可以增加針對(duì)該組件的裝飾類。
5.JavaIo與裝飾模式
java.IO包中的很多類使用了裝飾模式。
Reader
FileReader
BufferdReader
到此這篇關(guān)于Java設(shè)計(jì)模式之裝飾模式詳解的文章就介紹到這了,更多相關(guān)Java裝飾模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區(qū)別
這篇文章主要介紹了IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法
這篇文章主要介紹了Java微信小程序oss圖片上傳的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外
這篇文章主要介紹了使用springBoot項(xiàng)目配置文件位置調(diào)整到打包外,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)
本文主要介紹了SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

