國(guó)外搜索引擎網(wǎng)址網(wǎng)站推廣優(yōu)化怎么做最好
小談設(shè)計(jì)模式(7)—裝飾模式
- 專(zhuān)欄介紹
- 專(zhuān)欄地址
- 專(zhuān)欄介紹
- 裝飾模式
- 裝飾模式角色
- Component(抽象組件)
- ConcreteComponent(具體組件)
- Decorator(抽象裝飾器)
- ConcreteDecorator(具體裝飾器)
- 工作流程
- 首先
- 其次
- 然后
- 最后
- Java代碼實(shí)現(xiàn)
- 代碼分析
- 優(yōu)缺點(diǎn)分析
- 優(yōu)點(diǎn)
- 符合開(kāi)閉原則
- 可以動(dòng)態(tài)地添加/刪除功能
- 遵循單一職責(zé)原則
- 裝飾器類(lèi)與具體組件類(lèi)獨(dú)立
- 缺點(diǎn)
- 可能產(chǎn)生過(guò)多的具體裝飾器類(lèi)
- 裝飾器與組件類(lèi)的接口不一致
- 總結(jié)
專(zhuān)欄介紹
專(zhuān)欄地址
link
專(zhuān)欄介紹
主要對(duì)目前市面上常見(jiàn)的23種設(shè)計(jì)模式進(jìn)行逐一分析和總結(jié),希望有興趣的小伙伴們可以看一下,會(huì)持續(xù)更新的。希望各位可以監(jiān)督我,我們一起學(xué)習(xí)進(jìn)步,加油,各位。
裝飾模式
裝飾模式(Decorator Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你動(dòng)態(tài)地向一個(gè)對(duì)象添加額外的功能,而不需要修改其原始類(lèi)。通過(guò)將對(duì)象包裝在裝飾器類(lèi)中,你可以在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,逐步地添加功能。
裝飾模式角色
Component(抽象組件)
定義了具體組件和裝飾器的共同接口,可以是抽象類(lèi)或接口。
ConcreteComponent(具體組件)
實(shí)現(xiàn)了抽象組件定義的接口,是被裝飾的原始對(duì)象。
Decorator(抽象裝飾器)
包含一個(gè)指向具體組件的引用,并實(shí)現(xiàn)了抽象組件定義的接口。
ConcreteDecorator(具體裝飾器)
通過(guò)裝飾器對(duì)具體組件進(jìn)行擴(kuò)展或修改,添加額外的功能。
工作流程
首先
定義一個(gè)抽象組件(Component),它聲明了具體組件和裝飾器共同的接口方法。
其次
創(chuàng)建一個(gè)具體組件(ConcreteComponent),它實(shí)現(xiàn)了抽象組件的接口方法,是被裝飾的原始對(duì)象。
然后
創(chuàng)建一個(gè)抽象裝飾器(Decorator),它也實(shí)現(xiàn)了抽象組件的接口方法,并包含一個(gè)指向具體組件的成員變量(通常為抽象組件類(lèi)型),用于持有被裝飾的對(duì)象。
最后
創(chuàng)建具體裝飾器(ConcreteDecorator),它繼承自抽象裝飾器,并在裝飾器的基礎(chǔ)上添加了額外的功能。具體裝飾器中通常會(huì)重寫(xiě)抽象組件的接口方法,以在調(diào)用前后進(jìn)行額外的處理,然后再調(diào)用被裝飾對(duì)象的相應(yīng)方法。
Java代碼實(shí)現(xiàn)
// Step 1: 定義抽象組件
interface Component {void operation();
}// Step 2: 創(chuàng)建具體組件
class ConcreteComponent implements Component {public void operation() {System.out.println("執(zhí)行具體組件的操作");}
}// Step 3: 創(chuàng)建抽象裝飾器
abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}// Step 4: 創(chuàng)建具體裝飾器
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {// 在調(diào)用具體組件操作前進(jìn)行額外處理System.out.println("在調(diào)用具體組件操作前進(jìn)行額外處理");// 調(diào)用具體組件的操作super.operation();// 在調(diào)用具體組件操作后進(jìn)行額外處理System.out.println("在調(diào)用具體組件操作后進(jìn)行額外處理");}
}// 使用裝飾模式
public class Main {public static void main(String[] args) {// 創(chuàng)建具體組件對(duì)象Component component = new ConcreteComponent();// 創(chuàng)建具體裝飾器對(duì)象,并將具體組件對(duì)象傳入Component decorator = new ConcreteDecorator(component);// 調(diào)用裝飾后的操作decorator.operation();}
}
代碼分析
Component 是抽象組件接口,ConcreteComponent 是具體組件類(lèi),實(shí)現(xiàn)了抽象組件接口的方法。Decorator 是抽象裝飾器類(lèi),實(shí)現(xiàn)了抽象組件接口,并持有一個(gè)抽象組件類(lèi)型的成員變量。ConcreteDecorator 是具體裝飾器類(lèi),繼承自抽象裝飾器類(lèi),并重寫(xiě)了操作方法,在調(diào)用前后添加了額外處理。
在主函數(shù)中,先創(chuàng)建具體組件對(duì)象ConcreteComponent,然后將其傳入具體裝飾器對(duì)象ConcreteDecorator 的構(gòu)造函數(shù)中,用裝飾器包裝具體組件。最后調(diào)用裝飾后的操作,會(huì)按照一定的順序執(zhí)行額外處理和具體組件操作。
優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn)
符合開(kāi)閉原則
可以在不修改現(xiàn)有代碼的情況下,通過(guò)新增裝飾器類(lèi)來(lái)擴(kuò)展對(duì)象的功能。
可以動(dòng)態(tài)地添加/刪除功能
可以根據(jù)需要?jiǎng)討B(tài)地添加或刪除對(duì)象的功能,組合不同的裝飾器實(shí)現(xiàn)不同的行為組合。
遵循單一職責(zé)原則
具體的組件類(lèi)只負(fù)責(zé)核心功能,具體的裝飾器類(lèi)只關(guān)注附加的功能,各個(gè)類(lèi)職責(zé)明確,可維護(hù)性高。
裝飾器類(lèi)與具體組件類(lèi)獨(dú)立
裝飾器類(lèi)與具體組件類(lèi)之間是松耦合的關(guān)系,可以獨(dú)立變化,增加或刪除裝飾器不會(huì)影響其他組件的行為。
缺點(diǎn)
可能產(chǎn)生過(guò)多的具體裝飾器類(lèi)
如果系統(tǒng)中有很多功能需要擴(kuò)展,可能會(huì)導(dǎo)致產(chǎn)生大量的具體裝飾器類(lèi),增加系統(tǒng)的復(fù)雜性。
裝飾器與組件類(lèi)的接口不一致
在裝飾器模式中,裝飾器類(lèi)和具體組件類(lèi)的接口不一致,導(dǎo)致客戶端需要區(qū)分調(diào)用。
總結(jié)
裝飾模式提供了一種靈活的、可擴(kuò)展的方式來(lái)修改對(duì)象的功能,同時(shí)保持了簡(jiǎn)單的接口和代碼的可維護(hù)性。但是需要權(quán)衡好擴(kuò)展的復(fù)雜度和對(duì)象接口的一致性。