輕松掌握java裝飾者模式
定義:在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象。
特點(diǎn):
(1) 裝飾對(duì)象和真實(shí)對(duì)象有相同的接口。這樣客戶端對(duì)象就能以和真實(shí)對(duì)象相同的方式和裝飾對(duì)象交互。
(2) 裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用(reference)
(3) 裝飾對(duì)象接受所有來自客戶端的請(qǐng)求。它把這些請(qǐng)求轉(zhuǎn)發(fā)給真實(shí)的對(duì)象。
(4) 裝飾對(duì)象可以在轉(zhuǎn)發(fā)這些請(qǐng)求以前或以后增加一些附加功能。這樣就確保了在運(yùn)行時(shí),不用修改給定對(duì)象的結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮脑O(shè)計(jì)中,通常是通過繼承來實(shí)現(xiàn)對(duì)給定類的功能擴(kuò)展。
企業(yè)級(jí)開發(fā)和常用框架中的應(yīng)用:IO流底層架構(gòu)
組成:
(1)抽象構(gòu)件(Component)角色:給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。
?。?)具體構(gòu)件(Concrete Component)角色:定義一個(gè)將要接收附加責(zé)任的類。
?。?)裝飾(Decorator)角色:持有一個(gè)構(gòu)件(Component)對(duì)象的實(shí)例,并實(shí)現(xiàn)一個(gè)與抽象構(gòu)件接口一致的接口。
?。?)具體裝飾(Concrete Decorator)角色:負(fù)責(zé)給構(gòu)件對(duì)象添加上附加的責(zé)任。
具體實(shí)例:
/**
* 以下裝飾房子舉例
*/
public class Demo {
public static void main(String[] args) {
GenericHouse house = new GenericHouse();
Garage garage = new Garage(house);
garage.doSomething();
Kitchen kitchen = new Kitchen(house);
kitchen.doSomething();
}
}
/**
* 抽象構(gòu)件角色:一個(gè)接口,用以規(guī)范具體裝飾的位置
*/
interface AbstractHouse{
public void doSomething();
}
/**
* 裝飾角色: 持有要裝飾的對(duì)象
*/
class Master implements AbstractHouse{
private AbstractHouse abstractHouse;
public Master(AbstractHouse abstractHouse) {
this.abstractHouse = abstractHouse;
}
public void doSomething() {
System.out.println("裝飾角色:裝飾角色持有者,在這兒就是房子的主人");
abstractHouse.doSomething();
}
}
/**
* 具體的構(gòu)件角色:具體需要被裝飾的對(duì)象
*/
class GenericHouse implements AbstractHouse{
public void doSomething() {
System.out.println("具體構(gòu)建角色:房子可以住人,遮風(fēng)擋雨!");
}
}
/**
* 具體裝飾角色: 具體的裝飾就是在這兒做的,它繼承自裝飾角色,因?yàn)檠b飾角色持有被裝飾對(duì)象,
* 所以它也就持有了被裝飾對(duì)象,可以做裝飾
*/
class Garage extends Master{
public Garage(AbstractHouse abstractHouse) {
super(abstractHouse);
}
public void doSomething() {
super.doSomething();
System.out.println("具體裝飾角色:在這兒做裝飾的事兒,把房子中的一間裝飾成車庫,所以房子可以存放車子了");
}
}
/**
* 具體裝飾角色: 具體的裝飾就是在這兒做的,它繼承自裝飾角色,因?yàn)檠b飾角色持有被裝飾對(duì)象,
* 所以它也就持有了被裝飾對(duì)象,可以做裝飾
*/
class Kitchen extends Master{
public Kitchen(AbstractHouse abstractHouse) {
super(abstractHouse);
}
public void doSomething() {
super.doSomething();
System.out.println("具體裝飾角色:在這兒做裝飾的事兒,把房子中的一間裝飾成廚房,所以房子可以做飯了");
}
}
在實(shí)際開發(fā)中,裝飾著模式的包裝作用有很大的作用,我們可以在不改變?cè)瓉韺?duì)象的情況下,對(duì)對(duì)象做一些其他的操作,這樣可以避免我們改造對(duì)象,但同時(shí)我們又可以很好的完成一些操作。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
@RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入
這篇文章主要介紹了@RequiredArgsConstructor如何實(shí)現(xiàn)構(gòu)造器注入問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09
解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
SpringBoot 對(duì)象存儲(chǔ) MinIO的詳細(xì)過程
MinIO 是一個(gè)基于 Go 實(shí)現(xiàn)的高性能、兼容 S3 協(xié)議的對(duì)象存儲(chǔ),它適合存儲(chǔ)海量的非結(jié)構(gòu)化的數(shù)據(jù),這篇文章主要介紹了SpringBoot 對(duì)象存儲(chǔ) MinIO,需要的朋友可以參考下2023-07-07
淺析EasyExcel如何導(dǎo)出自動(dòng)回顯中文
這篇文章主要為大家詳細(xì)介紹了EasyExcel如何通過全局轉(zhuǎn)換器和自定義注解實(shí)現(xiàn)導(dǎo)出自動(dòng)回顯中文,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04

